package org.hotswap.agent.util.classloader;
import java.lang.reflect.Method;
import org.hotswap.agent.logging.AgentLogger;
import org.hotswap.agent.util.ReflectionHelper;
/**
* Utility method for classloaders.
*/
public class ClassLoaderHelper {
private static AgentLogger LOGGER = AgentLogger.getLogger(ClassLoaderHelper.class);
public static Method findLoadedClass;
static {
try {
findLoadedClass = ClassLoader.class.getDeclaredMethod("findLoadedClass", new Class[] { String.class });
findLoadedClass.setAccessible(true);
} catch (NoSuchMethodException e) {
LOGGER.error("Unexpected: failed to get ClassLoader findLoadedClass method", e);
}
}
/**
* Check if the class was already loaded by the classloader. It does not try to load the class
* (opposite to Class.forName()).
*
* @param classLoader classLoader to check
* @param className fully qualified class name
* @return true if the class was loaded
*/
public static boolean isClassLoaded(ClassLoader classLoader, String className) {
try {
return findLoadedClass.invoke(classLoader, className) != null;
} catch (Exception e) {
LOGGER.error("Unable to invoke findLoadedClass on classLoader {}, className {}", e, classLoader, className);
return false;
}
}
/**
* Some class loader has activity state. e.g. WebappClassLoader must be started before it can be used
*
* @param classLoader the class loader
* @return true, if is class loder active
*/
public static boolean isClassLoderStarted(ClassLoader classLoader) {
if ("org.glassfish.web.loader.WebappClassLoader".equals(classLoader.getClass().getName())||
"org.apache.catalina.loader.WebappClassLoader".equals(classLoader.getClass().getName())) {
try {
Class<?> clazz = classLoader.getClass();
boolean isStarted;
if ("org.apache.catalina.loader.WebappClassLoaderBase".equals(clazz.getSuperclass().getName())) {
clazz = clazz.getSuperclass();
isStarted = "STARTED".equals((String) ReflectionHelper.invoke(classLoader, clazz, "getStateName", new Class[] {}, null));
} else {
isStarted = (boolean) ReflectionHelper.invoke(classLoader, clazz, "isStarted", new Class[] {}, null);
}
return isStarted;
} catch (Exception e) {
LOGGER.warning("isClassLoderStarted() : {}", e.getMessage());
}
}
return true;
}
}