Erhalte Bytecode von der geladenen Klasse

9

Angenommen, in meiner JVM habe ich eine geladene Klasse Class<C> myClass . Gibt es eine zuverlässige Möglichkeit, die JVM nach dem Bytecode Inhalt der .class zu fragen? I.e. etwas wie das:

%Vor%

(offensichtlich wäre InputStream genauso gut wie byte[] ). Ich weiß, dass ich myClass.getResource() (und Freunde) verwenden kann, um die Klassendatei zu holen, aber hämmern auf den Klassennamen, um eine URL zu bekommen, die getResource zugeführt wird, fühlt sich falsch an. Ich bin mir auch nicht sicher, wie sich das verhalten würde, wenn C dynamisch generiert würde (z. B. mit javax.tools.JavaCompiler ).

Irgendwelche (bessere) Idee?

Hinweis: Ziel ist es, die Bytecode -Klassen auf eine andere JVM zu übertragen und sie mit einem benutzerdefinierten Klassenlader zu laden

    
CAFxX 26.06.2013, 13:13
quelle

2 Antworten

6
  

Hinweis: Ziel ist es, den Bytecode mit einem benutzerdefinierten Klassenlader auf einer anderen JVM laden zu können

Ein Classloader lädt nicht nur den Bytecode . Wenn Sie also den Bytecode aus dem JVM-Speicher holen könnten (was theoretisch möglich ist, wenn Sie viel implementierungsspezifischen nativen Code schreiben), wäre das für Ihren Remote-Classloader nutzlos. Sie müssen eine tatsächliche .class -Datei angeben.

Und Class.getResource ( ) ist der beste Weg, um diese Aufgabe zu erfüllen. Da es im selben Paket wie die aufrufende Klasse aussieht, müssen Sie nur den einfachen Namen der Klasse übernehmen, ".class" anhängen und fertig.

Es wird etwas schwieriger, wenn Sie innere oder verschachtelte Klassen haben, aber das ist ein Implementierungsdetail, mit dem Sie sich trotzdem befassen müssen (wenn Sie die anfängliche Klasse drücken, müssen Sie noch alle abhängigen Klassen ziehen ).

    
parsifal 26.06.2013, 14:20
quelle
2

Sie können die ASM-Bibliothek verwenden, um den Detailbytecode einer Klasse abzurufen. Ein Beispielcode ist unten.

%Vor%     
shijie xu 23.04.2015 20:58
quelle

Tags und Links