Dynamische Codeausführung

7

Ähnlich wie bei dynamischem SQL, bei dem ein String zur Laufzeit als SQL ausgeführt wird, kann Java-Code dynamisch ausgeführt werden? Wie ich einen String zurückgeben, der ein Java-Code ist und dann zur Laufzeit ausführen. Ist das möglich?

    
Sid 12.11.2010, 15:27
quelle

7 Antworten

14

Für echten Java-Code ist dies möglich mit JavaCompiler Schnittstelle. Es ist jedoch sehr umständlich zu verwenden, da es nur eine Schnittstelle zu einem echten Java-Compiler ist, der erwartet, dass komplette Klassendefinitionen in Dateien kompiliert werden.

Die einfachste Möglichkeit zur Ausführung von Code, der zur Laufzeit bereitgestellt wird, ist die Rhino JavaScript Engine .

Diese beiden Optionen waren nur in Java 6 enthalten, obwohl ich glaube, dass die Skriptschnittstelle bereits existierte. Daher könnten Sie Rhino in einer früheren JRE verwenden, wenn Sie es herunterladen und zum Klassenpfad hinzufügen.

    
Michael Borgwardt 12.11.2010, 15:36
quelle
5

Javassist

Sie müssten eine Bytecode-Manipulationsbibliothek verwenden, z. B. Javaassist ( Wikipedia ), um eine beliebige Zeichenfolge auszuführen, die zur Laufzeit bereitgestellt wird. Mit JavaSist können Sie CtClass basierend auf einer Zeichenfolge erstellen, die den Quellcode darstellt. und kann dies dann in kompiliertes Class -Objekt über einen bestimmten Klassenlader verwandeln, so dass die Klasse dann für Ihre Anwendung verfügbar ist. Andere Bibliotheken müssten etwas Ähnliches wie diese beiden Schritte tun, um dasselbe zu erreichen.

Es ist also möglich, aber es ist sehr schwer und macht Ihre Bewerbung wahrscheinlich sehr schwierig. Wenn es überhaupt möglich ist, sollten Sie eine sehr flexible Klasse statisch entwerfen und Parameter akzeptieren, die ihr Verhalten steuern.

    
Andrzej Doyle 12.11.2010 15:30
quelle
4

Wenn Sie mehr als nur eine vorhandene Methode dynamisch aufrufen möchten, müssen Sie möglicherweise Ihre Zeichenfolge in Bytecode kompilieren. Eine einfache Möglichkeit besteht darin, den Eclipse / JDT-Compiler jar in Ihren Klassenpfad einzufügen, und Sie können diesen dann verwenden, um Ihren String in eine Klasse zu kompilieren, die dann geladen werden kann.

Diese Art der dynamischen Codegenerierung und -ausführung wird zum Konvertieren von JSP-Dateien in Servlets verwendet und in anderen Paketen wie JasperReports verwendet, um eine Berichtsspezifikation in eine Klasse umzuwandeln, die dann aufgerufen wird.

Denken Sie daran, dass Sie genau wie SQL vorsichtig sein müssen, um Code-Injection-Sicherheitsprobleme zu verhindern, wenn einer der String benutzerdefinierte Daten enthält.

    
jbindel 12.11.2010 15:33
quelle
3

Sie können sich auch die Java 6-Skriptunterstützung ansehen: Ссылка

Hier ist eine Version von hallo world, die ein Array von Strings erstellt und ein erstes ausgibt:

%Vor%     
Yuriy 12.11.2010 16:18
quelle
3

Schauen Sie sich Beanshell an. Es bietet einen Interpreter mit Java-ähnlicher Syntax.

    
ordnungswidrig 12.11.2010 15:31
quelle
2

Ja, das ist möglich. Sehen Sie sich die Java-Compiler-API an. Schau mal hier:

Ссылка

    
Travis Webb 12.11.2010 15:36
quelle
-1

Ja mit Reflektion: Tutorial

Und noch ein Tutorial von IBM

    
NimChimpsky 12.11.2010 15:28
quelle

Tags und Links