mirror of
https://github.com/ebean-orm/ebean.git
synced 2024-04-21 10:51:47 +00:00
66 lines
1.6 KiB
Java
66 lines
1.6 KiB
Java
package com.avaje.ebeaninternal.api;
|
|
|
|
|
|
/**
|
|
* Helper to find classes taking into account the context class loader.
|
|
*/
|
|
public class ClassUtil {
|
|
|
|
/**
|
|
* Return a new instance of the class using the default constructor.
|
|
*/
|
|
public static Object newInstance(String className) {
|
|
|
|
try {
|
|
Class<?> cls = forName(className);
|
|
return cls.newInstance();
|
|
} catch (Exception e) {
|
|
String msg = "Error constructing " + className;
|
|
throw new IllegalArgumentException(msg, e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Load a class taking into account a context class loader (if present).
|
|
*/
|
|
public static Class<?> forName(String name) throws ClassNotFoundException {
|
|
return new ClassLoadContext().forName(name);
|
|
}
|
|
|
|
|
|
/**
|
|
* Helper to wrap the context and caller classLoaders (to use/try both).
|
|
*/
|
|
static class ClassLoadContext {
|
|
|
|
private final ClassLoader contextLoader;
|
|
|
|
private final ClassLoader callerLoader;
|
|
|
|
ClassLoadContext() {
|
|
this.callerLoader = ClassUtil.class.getClassLoader();
|
|
this.contextLoader = contextLoader();
|
|
}
|
|
|
|
ClassLoader contextLoader() {
|
|
ClassLoader loader = Thread.currentThread().getContextClassLoader();
|
|
return (loader != null) ? loader: callerLoader;
|
|
}
|
|
|
|
public Class<?> forName(String name) throws ClassNotFoundException {
|
|
|
|
try {
|
|
return Class.forName(name, true, contextLoader);
|
|
} catch (ClassNotFoundException e) {
|
|
if (callerLoader == contextLoader) {
|
|
throw e;
|
|
} else {
|
|
return Class.forName(name, true, callerLoader);
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
|