¿Alguien sabe cómo averiguar programáticamente de dónde carga Java Classloader realmente la clase?
A menudo trabajo en proyectos grandes donde el classpath se hace muy largo y la búsqueda manual no es realmente una opción. Recientemente tuve un problema en el que el cargador de clases estaba cargando una versión incorrecta de una clase porque estaba en el classpath en dos lugares diferentes.
Entonces, ¿cómo puedo hacer que el cargador de clases me diga de qué parte del disco proviene el archivo de clase real?
Editar: ¿Qué pasa si el cargador de clases realmente no puede cargar la clase debido a una discrepancia de versión (u otra cosa), ¿hay alguna forma de que podamos averiguar qué archivo está tratando de leer antes de leerlo?
java
classpath
classloader
luke
fuente
fuente
Respuestas:
Aquí hay un ejemplo:
Esta impreso:
fuente
Test.class.getResource("Test.class")
que no repite el nombre del paquete.Test.class.getResource(Test.class.getSimpleName() + ".class")
BouncyCastleProvider
nombre completo del paquete, sin embargo se requiere.getClassLoader()
regresarnull
. Vea aquí una extensión de este método para manejar eso.Otra forma de averiguar desde dónde se carga una clase (sin manipular la fuente) es iniciar Java VM con la opción:
-verbose:class
fuente
fuente
Esto es lo que usamos:
Esto funcionará dependiendo de la implementación de ClassLoader:
getClass().getProtectionDomain().getCodeSource().getLocation()
fuente
La versión de Jon falla cuando el objeto
ClassLoader
se registra como lonull
que parece implicar que fue cargado por BootClassLoader
.Este método trata ese problema:
fuente
Editar solo la primera línea:
Main
.classSalida:
Tal vez mal estilo pero funciona bien!
fuente
Por lo general, no sabemos qué usar la codificación rígida. Podemos obtener className primero, y luego usar ClassLoader para obtener la URL de la clase.
fuente
Echa un vistazo a esta pregunta similar. Herramienta para descubrir la misma clase.
Creo que el obstáculo más relevante es si tienes un cargador de clases personalizado (cargando desde un db o ldap)
fuente
Manera simple:
Ejemplo de salida:
O
Ejemplo de salida:
fuente
Este enfoque funciona tanto para archivos como para frascos:
fuente
Suponiendo que está trabajando con una clase llamada
MyClass
, lo siguiente debería funcionar:Si puede o no obtener la ubicación en el disco del archivo .class depende del cargador de clases en sí. Por ejemplo, si está utilizando algo como BCEL, una clase determinada puede que ni siquiera tenga una representación en el disco.
fuente