org.test4j.mock.faking.util.ClassLoad Maven / Gradle / Ivy
package org.test4j.mock.faking.util;
import java.util.concurrent.locks.ReentrantLock;
import static org.test4j.mock.faking.util.ReflectUtility.doThrow;
import static org.test4j.mock.faking.util.TypeUtility.PRIMITIVE_CLASS;
public final class ClassLoad {
public static final ClassLoader CLASS_LOADER = SearchingClassLoader.combineLoadersOf(null);
private ClassLoad() {
}
public static ClassLoader loadersOf(Class first, Class... types) {
return SearchingClassLoader.combineLoadersOf(first, types);
}
/**
* 查找class, initialize = false
*
* @param className
* @param
* @return
*/
public static Class loadClass(String className) {
if (className == null) {
return null;
}
if (PRIMITIVE_CLASS.containsKey(className)) {
return PRIMITIVE_CLASS.get(className);
}
try {
String clazzName = className.replace('/', '.');
return (Class) Class.forName(clazzName, false, CLASS_LOADER);
} catch (LinkageError | ClassNotFoundException e) {
return doThrow(e);
}
}
/**
* 类是否在classpath中
*
* @param typeName
* @return
*/
public static boolean isInClasspath(String typeName) {
try {
Class clazz = loadClass(typeName);
return clazz != null;
} catch (Throwable ignore) {
return false;
}
}
private static final ReentrantLock LOCK = new ReentrantLock();
/**
* 在某些环境下, 需要在这里静态定义 {@link ReentrantLock} 实例
* 否则BridgeFakeInvocation不生效 :(
* TODO
*
* @return
*/
public static boolean isLoading() {
if (LOCK.isHeldByCurrentThread()) {
return true;
} else {
return false;
}
}
}