Frage

In Java ist es möglich, eine Klassendefinition on the fly zu erstellen, während eine Anwendung ausgeführt wird, und dann ein Objekt dieser Klasse erstellen?

Zum Beispiel kann eine laufende Anwendung würde in einer Textdatei lesen, die eine Liste der Klassenmitglieder enthalten in der neuen Klasse gehören. Die Anwendung würde dann eine Klassendefinition definieren, die auf der Liste der Mitglieder basiert, und insantiate es dann.

War es hilfreich?

Lösung

Ja, es ist möglich, so in der Theorie Byte-Code Ihrer Klasse zu tun, Datei, die am Ende ein Byte-Array ist! Sie können dann die Methode defineClass (String, byte [], int, int) verwenden, um eine Klasse Instanz zu erhalten, die verwendet werden können Objekte über Reflexion zu instanziieren.

In der Praxis können Sie so etwas wie verwenden CGLIB oder javaassist .

Sie können auch den langen Weg der Erzeugung des Java-Code in einer Datei, das Aufrufen der Compiler verwenden, dann die Datei zu laden.

Andere Tipps

Sie können Klassen dynamisch generieren mit ASM

Sie können dies tun, indem Sie den Code für die neue Klasse in eine Datei schreiben, dann auf diese Datei, um den Java-Compiler aufrufen und einen Klassenlader verwenden, um dynamisch die Klasse in die laufende Anwendung zu laden. Apache Tomcat tut dies für seine JSP-Seiten; es nimmt den Code, macht einige Änderungen daran, wickelt es in einem try / catch-Block in der Mitte einer Klasse, die es dann auf das Dateisystem schreibt, kompiliert und verwendet einen Classloader um es zu bekommen und klagen Anfragen zu bedienen.

Natürlich ist es möglich. Siehe zum Beispiel dieses Artikel rel="nofollow.

Vielleicht ist die einfachste Lösung (in Bezug auf die nicht zusätzliche Bibliotheken erforderlich) wäre, die Java-Compiler API das kommt mit Java 6. Sie einfach nur in der Lage sein, die .java zu generieren, kompilieren und dann eine Class.forName ausführen () .

Vielleicht ein wenig übertrieben, das Apache BCEL (Byte Code Engineering Library) kann verwendet werden, erstellen class Dateien, die während der Laufzeit.

Auch wenn ich es selbst nicht ausprobiert haben, ist denkbar, konnte man dann eine Klasse zu erstellen, laden Sie es, und instanziiert es während der Laufzeit.

Ja, das ist möglich.

können Sie erstellen Klassen mit Javassist zur Laufzeit durch den Körper der Klasse definieren und machen Javassist die neue Klasse zu kompilieren.

Javassist hat einen benutzerdefinierten Compiler, den Bytecode auf der Grundlage der Definition der Klasse erstellt. Es hat einige besondere Möglichkeiten, Dinge zu behandeln, aber es ist sehr einfach und intuitiv diese Bibliothek zu verwenden.

wird Javassist auf JBoss verwendet, und ich denke, dass eine gute Referenz ist:)

Das gleiche kann mit BCEL erreicht werden, aber es ist viel schwieriger (aber auf diese Weise Sie haben mehr Kontrolle darüber, was erzeugt wird).

Sie könnten wahrscheinlich etwas wie die mit JRuby tun, oder JPython oder Groovy, wenn Sie müssen.

Wenn Sie etwas besonders masochistisch Sie unter BCEL .

Wenn Sie Java und metaprogramming möchten, verwenden Sie Groovy .

ASM ist die unterste Ebene Bytecode-Bibliothek für Java, nehme ich an. Das macht es sehr hart, aber auch sehr mächtig. Ich empfehle die Lektüre ASM in der Dokumentation ( PDF ), um wirklich zu verstehen, wie Bytecode Generation in Java funktioniert. Diese Dokumentation erläutert auch, wie die Bytecode in den Class-Loader laden (ein weiteres schwer Thema richtig zu machen).

Danach können Sie eine der höheren Ebene Bibliotheken verwenden können, wenn es Ihnen das Leben leichter macht, und verstehen, was sie tun. Für viele Fälle, wie das Erzeugen von Proxies, die CGLIB ist nützlich und einfach zu bedienen. Für mehr Leistung haben viele Javassist (I haven erwähnt‘ t verwendet es -. CGLIB und ASM für mich gut gewesen)

Es gab eine letzte Frage hier in Bezug auf in-Memory-Kompilation , die Ihnen einige Hinweise geben sollte, was zu tun, nachdem Sie den Quellcode zu generieren geschafft haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top