2010-04-29 2 views
15

Gibt es in Java eine Möglichkeit (zur Laufzeit), den Bytecode zu erhalten, der eine bestimmte Klasse definiert hat?Gibt es eine Möglichkeit, den Bytecode für eine Klasse zur Laufzeit zu erhalten?

Oder anders gesagt, gibt es eine Möglichkeit, das byte[] Array zu ClassLoader.defineClass(String name, byte[] b, int off, int len) übergeben, wenn eine bestimmte Klasse geladen wurde? Ich sehe, dass diese Methode final deklariert wird, so dass das Erstellen einer benutzerdefinierten ClassLoader zum Abfangen von Klassendefinitionen scheint nicht in Frage.

In der Vergangenheit habe ich die Klasse ClassLoader der Klasse verwendet, um den Bytecode über die getResourceAsStream(String) Methode zu erhalten, aber ich würde eine kanonische Lösung bevorzugen.

+0

Warum getResourceAsStream(String) nicht kanonisch zu implementieren? – Riduidel

+2

@Riduidel: Nicht alle Klassenlader setzen den Bytecode als Ressource frei. Zum Beispiel erzeugen einige Ladeprogramme für benutzerdefinierte Klassen den Bytecode * on the fly * und geben sie nicht zurück, wenn 'getResourceAsStream' aufgerufen wird. –

+0

Das könnte eine dumme Frage sein, aber warum müssen Sie die Byte-Codes für eine bestimmte Klasse bekommen? Vermutlich möchten Sie getResourceAsStream nicht verwenden, da einige Klassen möglicherweise von einem anderen Klassenlader geladen werden? – Geoff

Antwort

5

"Java-Agenten" wäre die offensichtliche Lösung.

+0

Interessant, ich habe noch nie von Agenten gehört! –

Verwandte Themen