Frage

Wie kann ich Bytecode (Byte []) aus einer Zeichenfolge zur Laufzeit generieren, ohne dass ein „javac“ Prozess oder etwas dieser Art zu verwenden? ist es eine einfache Möglichkeit, den Compiler wie der Aufruf?

später Zusatz:

Ich entschied mich für href="https://stackoverflow.com/questions/200833/when-should-i-accept-an-answer"> zum mein Situation . meine Anwendung ist ein Hobby-Projekt noch in Entwurfsskizze Phase und es ist die richtige Zeit, um neue Technologie zu prüfen, einsetzen. auch, da der Typ, den mir mit BL angenommen hat, zu helfen, ein JavaScript-Entwickler ist, die Idee, ein JavaScript-Interpreter anstelle einen Stub-Compiler + classloader verwenden scheint in dieser Situation für mich attraktiver. andere (nicht angenommene) Antworten auf diese Frage sind informativ und, soweit ich das beurteilen kann, meine Frage beantworten, sehr gut, also danke, aber ich werde versuchen, Rhino :)

War es hilfreich?

Lösung

Sie könnte so etwas wie Nashorn finden oder nützlicher in der Praxis groovy.

Andere Tipps

JDK6 hat einen Java-Compiler API . Es ist jedoch nicht unbedingt sehr einfach zu bedienen.

Eine schnelle Google nach oben gezogen diesem Beispiel Verwendung .

Ich denke, Ihre beste Chance sein wird Janino . Das wird Sie Code zur Laufzeit kompilieren und aus dem Rest des Programms aufrufen. Wir verwenden es in einigen unserer Systeme uns dynamisch zu lassen, einige Klassen aktualisieren.

Es ist nicht kostenlos. Es funktioniert gut, aber es nutzt Permgen Raum jedes Mal, wenn eine neue Klasse laden (oder Version einer Klasse), so dass Sie schließlich über genügend Arbeitsspeicher ausgeführt, wenn Sie einen (wirklich) lang haben Prozess läuft (oder etwas, das viele neue Klassen lädt ), aber Sie können die Menge des Permgen Raumes in der JVM ändern diese Barriere aus ziemlich weit zu bewegen, wenn das ein Problem ist.

Janino ist eigentlich ein Compiler, aber man konnte sehen, wie es den Bytecode spritzt, wenn Sie auf dieser Ebene arbeiten müssen. Möglicherweise müssen Sie einen Klassenlader, um am Ende zu machen oder den Java-Compiler API verwenden, wie Tom Hawtin vorgeschlagen.

Sie können die Compiler zugreifen, solange die tools.jar Datei von Ihrem JDK auf dem Classpath ist. Die Dokumentation ist hier . Die API ist nicht so einfach wie eval() in einigen interpretierte Sprachen, aber es ist da.

Sie können auch in einig seltsamen Classloader-Code erhalten haben, um tatsächlich zu, dass Code ausgeführt werden, ich bin mir nicht ganz sicher.

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