| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * https://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package org.apache.avro.util; |
| |
| public class ClassUtils { |
| |
| private ClassUtils() { |
| } |
| |
| /** |
| * Loads a class using the class loader. 1. The class loader of the current |
| * class is being used. 2. The thread context class loader is being used. If |
| * both approaches fail, returns null. |
| * |
| * @param className The name of the class to load. |
| * @return The class or null if no class loader could load the class. |
| */ |
| public static Class<?> forName(String className) throws ClassNotFoundException { |
| return ClassUtils.forName(ClassUtils.class, className); |
| } |
| |
| /** |
| * Loads a class using the class loader. 1. The class loader of the context |
| * class is being used. 2. The thread context class loader is being used. If |
| * both approaches fail, returns null. |
| * |
| * @param contextClass The name of a context class to use. |
| * @param className The name of the class to load |
| * @return The class or null if no class loader could load the class. |
| */ |
| public static Class<?> forName(Class<?> contextClass, String className) throws ClassNotFoundException { |
| Class<?> c = null; |
| if (contextClass.getClassLoader() != null) { |
| c = forName(className, contextClass.getClassLoader()); |
| } |
| if (c == null && Thread.currentThread().getContextClassLoader() != null) { |
| c = forName(className, Thread.currentThread().getContextClassLoader()); |
| } |
| if (c == null) { |
| throw new ClassNotFoundException("Failed to load class" + className); |
| } |
| return c; |
| } |
| |
| /** |
| * Loads a class using the class loader. 1. The class loader of the context |
| * class is being used. 2. The thread context class loader is being used. If |
| * both approaches fail, returns null. |
| * |
| * @param classLoader The classloader to use. |
| * @param className The name of the class to load |
| * @return The class or null if no class loader could load the class. |
| */ |
| public static Class<?> forName(ClassLoader classLoader, String className) throws ClassNotFoundException { |
| Class<?> c = null; |
| if (classLoader != null) { |
| c = forName(className, classLoader); |
| } |
| if (c == null && Thread.currentThread().getContextClassLoader() != null) { |
| c = forName(className, Thread.currentThread().getContextClassLoader()); |
| } |
| if (c == null) { |
| throw new ClassNotFoundException("Failed to load class" + className); |
| } |
| return c; |
| } |
| |
| /** |
| * Loads a {@link Class} from the specified {@link ClassLoader} without throwing |
| * {@link ClassNotFoundException}. |
| * |
| * @param className |
| * @param classLoader |
| * @return |
| */ |
| private static Class<?> forName(String className, ClassLoader classLoader) { |
| Class<?> c = null; |
| if (classLoader != null && className != null) { |
| try { |
| c = Class.forName(className, true, classLoader); |
| } catch (ClassNotFoundException e) { |
| // Ignore and return null |
| } |
| } |
| return c; |
| } |
| } |