2010-04-29 11 views
15

In Java, esiste un modo (in fase di esecuzione) per ottenere il bytecode che ha definito una particolare classe?C'è un modo per ottenere il bytecode per una classe in fase di esecuzione?

In un altro modo, c'è un modo per ottenere l'array byte[] passato a ClassLoader.defineClass(String name, byte[] b, int off, int len) quando una particolare classe è stata caricata? Vedo che questo metodo è dichiarato final, quindi la creazione di un codice personalizzato ClassLoader per intercettare le definizioni di classe sembra fuori questione.

In passato, ho utilizzato il codice ClassLoader della classe per ottenere il bytecode tramite il metodo getResourceAsStream(String), ma preferirei una soluzione più canonica.

+0

Perché non è getResourceAsStream(String) canonica? – Riduidel

+2

@Riduidel: non tutti i programmi di caricamento classi espongono il bytecode come risorsa. Ad esempio, alcuni programmi di caricamento classe personalizzati generano bytecode * al volo * e non si preoccupano di restituirlo quando viene chiamato 'getResourceAsStream'. –

+0

Questa potrebbe essere una domanda stupida, ma perché è necessario ottenere i codici byte per una determinata classe? Presumibilmente non si desidera utilizzare getResourceAsStream perché alcune classi potrebbero essere caricate da un altro classloader? – Geoff

risposta

9

Here è una descrizione di come implementare un agente

5

"Gli agenti Java" sarebbero la soluzione più ovvia.

+0

Interessante, non ho mai sentito parlare di agenti prima! –

Problemi correlati