En el entorno JEE, es útil saber desde dónde se carga una clase en particular.
Por ejemplo, tengo una instancia de org.slf4j.Logger proporcionada por una biblioteca de caja negra. ¿Es posible encontrar el cargador de clases responsable? ¿Si la clase de la instancia proviene de JDK, servidor de aplicaciones, EAR o cargador de clases de aplicaciones web?
Resulta ser bastante simple. El nombre del cargador de clases es devuelto por:
object.getClass().getClassLoader().getName() Devuelve algo como "aplicación" o "plataforma". Tenga cuidado: el cargador de clases es null , si la clase pertenece al cargador de clases de arranque, como lo hace el registrador JUL java.util.logging.Logger .
WebLogic tiene una larga cadena de cargadores de clases sin nombres. Los cargadores de clases de WebLogic contienen una annotation de campo útil. Uno puede leerlo para encontrar la aplicación JEE, el cargador de clases pertenece a:
public Object getAnnotation(ClassLoader classloader) { try { Method amethod = classloader.getClass().getMethod("getAnnotation"); return amethod.invoke(classloader); } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { return ""; } } Si desea imprimir una descripción general de todos los cargadores de clases disponibles sin buscar anotaciones, se puede usar el código hash de la instancia del cargador de clases. Aquí hay una pequeña página JSP. webapp en el directorio de aplicaciones web de su proyecto web para obtener una descripción general rápida.
<% response.setContentType("text/plain"); List<Class<?>> clazzes = List.of(Logger.class, object.getClass()); out.println("CLASSLOADERS:\n"); ClassLoader classloader = new Object() {}.getClass().getClassLoader(); while (classloader != null) { out.println( String.format("%-18s", classloader.getName()) + " " + String.format("%-10s", Integer.toHexString(classloader.hashCode())) + " " + classloader.getClass().getName() + " / " + getAnnotation(classloader)); classloader = classloader.getParent(); } out.println("\nCLASSES:\n"); for (Class<?> clazz : clazzes) { ClassLoader cloader = clazz.getClassLoader(); URL location = Optional.of(clazz.getProtectionDomain()).map(x->x.getCodeSource()).map(x->x.getLocation()).orElse(null); out.println( clazz + " \n " + (cloader != null ? Integer.toHexString(cloader.hashCode()) : "<bootstrap>") + "\t" + location); } %>