Leer un archivo Java .class
-
24-10-2019 - |
Pregunta
Quiero escribir una herramienta que genera algún código utilizando un compilado .class
archivo como entrada. Específicamente, quiero leer de este archivo de clase:
- Métodos, con anotaciones
- Parámetros del método, con anotaciones
El archivo de clase de entrada probablemente se referirá a varios tipos que no están en el classpath de la herramienta. Esto está bien, no necesito hacer nada con ellos, solo necesito leer nombres de tipos completamente calificados como cadenas. Necesito obtener información de las anotaciones, pero estarán en el classpath de la herramienta.
¿Hay una biblioteca que pueda usar para este propósito? Sería bueno si la API fuera un poco como la API de reflexión, pero no tiene que ser así.
Solución
ASM http://asm.ow2.org/ Le permite leer una clase desde un archivo de archivo/transmisión sin cargarlo de clase. Le permite ver anotaciones que no están cargadas en tiempo de ejecución. También se puede usar para modificar el código de byte de clase/anotaciones/método, etc.
Otros consejos
los herramienta Javap Incluido con el JDK probablemente ya haga lo que buscas.
Necesitas mirar dos cosas Reflection API
y Decompiler
Creo que podrías usar escaneo de clases de primavera.
ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(true);
String basePackage = "org/springframework/samples/petclinic";
Set<BeanDefinition> components = provider.findCandidateComponents(basePackage);
for (BeanDefinition component : components) {
System.out.printf("Component: %s\n", component.getBeanClassName());
}
Para obtener más información, puede investigar la primavera documentos
Estoy usando ASM para descubrir todos los métodos.
Si tiene acceso a generar el archivo .class, entonces el API de reflexión debería poder ayudar.