Dynamische code-Ausführung
Ähnlich dynamisches SQL, bei dem ein String ist ausgeführt, wie eine SQL zur Laufzeit, können wir Java-code ausführen dynamisch? Wie ich einen String zurückgeben, das ist ein Java-code und dann führe ich zur Laufzeit. Ist das möglich?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für echten Java-code, dies ist möglich mit der
JavaCompiler
- Schnittstelle. Aber es ist sehr unbequem zu benutzen, da es nur eine Schnittstelle zu einem echten Java-compiler erwartet zum kompilieren gesamte Klasse Definitionen finden sich in Dateien.Der einfachste Weg, um die Ausführung von code zur Laufzeit bereitgestellt wäre, die Nutzung Rhino JavaScript-engine.
Diese beiden Optionen wurden nur in Java 6, obwohl ich glaube, dass die scripting-Schnittstelle schon vor, so könnten Sie Rhino in einer früheren JRE, wenn Sie herunterladen und fügen Sie Sie dem classpath.
Javassist
Würden Sie brauchen, um eine bytecode-manipulation-Bibliothek wie Javassist (Wikipedia), um eine beliebige Zeichenfolge, die vorgesehen ist, zur Laufzeit. Javassist ermöglicht Ihnen das erstellen einer
CtClass
basierend auf einem string, der source-code und kann dann daraus zusammengestelltClass
Objekt über einen bestimmten classloader, so dass die Klasse ist dann für die Anwendung zur Verfügung. Andere Bibliotheken müssten etwas ähnliches tun, um diese beiden Schritte in der angegebenen Reihenfolge, das gleiche zu erreichen.So ist es möglich, aber es ist sehr im Schwergewicht und ist wahrscheinlich zu machen Ihre Anwendung sehr hart zu Grunde geht. Wenn möglich, betrachten Sie die Gestaltung einer sehr flexiblen Klasse statisch ist, und es akzeptieren Parameter, die der Steuerung von Verhalten.
Wenn Sie mehr tun wollen als das aufrufen einer vorhandenen Methode dynamisch ist, müssen Sie möglicherweise für die Kompilierung der String in bytecode. Eine einfache Möglichkeit, dies zu tun ist, auch die Eclipse/JDT-compiler-jar in den classpath, und dann können Sie es verwenden, kompilieren Sie Ihren String in eine Klasse, die dann geladen werden.
Diese Art von dynamischen code-Erzeugung und Ausführung wird verwendet, um zu konvertieren JSP-Dateien in Servlets verwendet und ist in anderen Paketen wie JasperReports einen Bericht Spezifikation in eine Klasse, die dann aufgerufen wird.
Denken Sie daran, dass, ebenso wie mit SQL müssen Sie vorsichtig sein, um zu verhindern, dass code-injection-Sicherheit Probleme, wenn eine der String enthält die vom Benutzer angegebenen Daten.
Eventuell möchten Sie auch zu schauen, Java 6 scripting-Unterstützung:
http://download.oracle.com/javase/6/docs/technotes/guides/scripting/programmer_guide/index.htm
Hier ist eine version von hello world, das schafft array von strings und druckt die erste:
Ja, es ist möglich. Blick auf die Java-Compiler-API. Schau mal hier:
http://download.oracle.com/javase/6/docs/api/javax/tools/JavaCompiler.html
Haben Sie einen Blick auf Beanshell. Es bietet einen interpreter mit java-ähnlichen syntax.
Ja mit Reflexion : tutorial
Und ein anderes tutorial hier aus IBM