2010-11-23 9 views
7
ClassWriter cw = new ClassWriter(...); 
byte[] bytes = cw.toByteArray(); 

Ich möchte neue Klasseninstanz von bytes Array erstellen. Wie mache ich das? Ist es überhaupt möglich?Java: neue Instanz von Bytecode

+1

möglich Duplikat von [Java: Wie wird die als Byte gespeicherte Klasse \ [\] in die JVM geladen?] (Http://stackoverflow.com/questions/1781091/java-how-to-load-class-stored-) as-byte-in-the-jvm) –

+0

@bruno conde: Es sieht so aus. Wir drücken die Dinge hier nur übersichtlicher aus –

+0

Sie können defineClass verwenden. Wenn Sie jedoch keinen benutzerdefinierten Klassenlader verwenden, müssen Sie möglicherweise Reflexionen verwenden, um sie als nicht öffentliche Methode zu bezeichnen. –

Antwort

8
+1

Schöne Antwort, aber schreckliche Formatierung und ein Java 1.4-Link. Beide geändert. –

+0

danke für die Bearbeitung, hatte damit zu kämpfen, aber Parser wollte nicht den Link richtig zeigen. –

+3

+1. Wie auch immer, die Methode ist geschützt, also brauchen Sie einen Weg, um darauf zuzugreifen. Das Erweitern des ClassLoader und das Bereitstellen einer öffentlichen Methode könnte eine Lösung sein. –

2

Dies ist möglich, und Sie müssen Reflexion verwenden, um dies zu erreichen. Der Pseudo-Code lautet:

+0

Ich bin ziemlich sicher, dass der 'loadIntoCurrentClassLoader (bytes) 'Teil ist, worum die Frage geht :-) –

+0

Ok, also bin ich etwas über Bord gegangen;) –

+0

Es ist mehrdeutig von der Art, wie die Frage formuliert wird. –

0

Ich kann die Klasse erstellen, indem Sie ClassLoader erweitern und defineClass verwenden. Aber dann hat die erstellte Klasse meinen erweiterten ClassLoader als ClassLoader, was zu Fehlern führt, wenn der Code meiner Klasse andere Klassen lädt. Vermutlich kann ich das umgehen, indem ich meinen ClassLoader erstelle, um alles auf die richtige Weise zu delegieren, aber es ist nicht offensichtlich, wie man das richtig macht.