/* * Copyright 2012 Christopher Pheby * Licensed 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 * http://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.jadira.scanner.core.utils.reflection; /** * Utility methods related to {@link ClassLoader} resolution and the like */ public final class ClassLoaderUtils { private ClassLoaderUtils() { } /** * Gets {@link ClassLoader} for the current thread * @param classLoaders ClassLoaders to be used if specified * @return The ClassLoaders, either those specified, or discovered * ClassLoaders for the current thread */ public static ClassLoader[] getClassLoaders(ClassLoader... classLoaders) { if (classLoaders != null && classLoaders.length > 0) { return classLoaders; } final ClassLoader ctxClassLoader = Thread.currentThread() .getContextClassLoader(); final ClassLoader staticClassLoader = ClassLoaderUtils.class .getClassLoader(); if (ctxClassLoader == null) { if (staticClassLoader == null) { return new ClassLoader[] {}; } else { return new ClassLoader[] { staticClassLoader }; } } else { if (staticClassLoader == null) { return new ClassLoader[] { ctxClassLoader }; } else { return new ClassLoader[] { ctxClassLoader, staticClassLoader }; } } } /** * Attempts to instantiate the named class, using each of the specified * ClassLoaders in turn or Class.forName if these do not work * @param name The class name * @param classLoaders ClassLoaders to be used * @return The Class instance * @throws ClassNotFoundException If the class cannot be found */ public static Class<?> classForName(String name, ClassLoader... classLoaders) throws ClassNotFoundException { ClassLoader[] cls = getClassLoaders(classLoaders); for (ClassLoader cl : cls) { try { if (cl != null) { return cl.loadClass(name); } } catch (ClassNotFoundException e) { // Ignore } } // Try using Class.forName() return Class.forName(name); } }