2010-04-29 8 views
15

En Java, ¿hay alguna manera (en tiempo de ejecución) de obtener el bytecode que define una clase en particular?¿Hay alguna manera de obtener el bytecode para una clase en tiempo de ejecución?

Dicho de otra manera, ¿hay alguna manera de obtener la matriz byte[] pasada al ClassLoader.defineClass(String name, byte[] b, int off, int len) cuando se cargó una clase en particular? Veo que este método está declarado final, por lo que la creación de un ClassLoader personalizado para interceptar las definiciones de clase parece estar fuera de cuestión.

En el pasado, he usado la clase ClassLoader para obtener el bytecode a través del método getResourceAsStream(String), pero preferiría una solución más canónica.

+0

¿Por qué no getResourceAsStream(String) canónica? – Riduidel

+2

@Riduidel: No todos los cargadores de clases exponen el bytecode como un recurso. Por ejemplo, algunos cargadores de clases personalizadas generan bytecode * sobre la marcha * y no se molestan en devolverlo cuando se llama a 'getResourceAsStream'. –

+0

Esto podría ser una pregunta tonta, pero ¿por qué necesitas obtener los códigos de bytes para una clase determinada? ¿Presumiblemente no desea utilizar getResourceAsStream porque algunas clases pueden ser cargadas por otro cargador de clases? – Geoff

Respuesta

9

Here es una descripción de cómo implementar un agente

5

"agentes de Java" sería la solución obvia.

+0

¡Interesante, nunca había oído hablar de agentes! –

Cuestiones relacionadas