Frage

Gibt es eine Möglichkeit extern gespeicherten Quellcode in Verwendung und es in ein Java-Programm laden, so dass es durch sie verwendet werden kann?

Ich möchte ein Programm, das ohne die Bearbeitung der vollständigen Quellcode geändert werden kann, und dass dies auch möglich, ohne dass dies jedes Mal zu kompilieren. Ein weiterer Vorteil ist, dass ich Teile des Codes ändern kann, wie ich will.

Natürlich habe ich Schnittstellen zu haben, so dass es möglich ist, Daten in diesen zu senden und sie zurück in das festen Quellprogramm immer wieder.

Und natürlich sollte es schneller sein als ein reines Interpretation System.

So ist es eine Möglichkeit, diese wie eine zusätzliche Compilierung dieser externen Quellcode-Teile und ein Start des Programms dabei Nachdem dies geschehen ist?

Vielen Dank im Voraus, Andreas:)

War es hilfreich?

Lösung

Sie müssen die javax.tools API für diese. So müssen Sie zumindest das JDK es zur Arbeit kommen installiert (und lassen Sie Ihre IDE-Punkt, um es anstelle des JRE). Hier ist ein grundlegendes Kickoff Beispiel (ohne richtige Ausnahme und Handhabung kodieren nur das grundlegende Beispiel weniger undurchsichtig zu machen, Hustet ):

public static void main(String... args) throws Exception {
    String source = "public class Test { static { System.out.println(\"test\"); } }";

    File root = new File("/test");
    File sourceFile = new File(root, "Test.java");
    Writer writer = new FileWriter(sourceFile);
    writer.write(source);
    writer.close();

    JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
    compiler.run(null, null, null, sourceFile.getPath());

    URLClassLoader classLoader = URLClassLoader.newInstance(new URL[] { root.toURI().toURL() });
    Class<?> cls = Class.forName("Test", true, classLoader);
}

Dies sollte test in stdout drucken, wie es durch die statischen Initialisierer in dem Test Quellcode getan. Eine weitere Nutzung wäre einfacher, wenn die Klassen implementiert eine bestimmte Schnittstelle, die bereits in dem Classpath ist. Andernfalls müssen Sie die Reflection-API Zugang und rufen Sie die Methoden einzubeziehen / Felder aus.

Andere Tipps

In Java 6 oder höher können Sie den Zugriff auf den Compiler durch das javax.tools Paket. ToolProvider.getSystemJavaCompiler () erhalten Sie eine javax.tools .JavaCompiler , die Sie Ihre Quelle kompilieren konfigurieren können. Wenn Sie frühere Versionen von Java verwenden, können Sie immer noch an sie durch die interne com.sun.tools.javac.Main Schnittstelle bekommen, obwohl es viel weniger flexibel ist.

Java6 hat einen Skript-API. Ich habe es mit Javascript verwendet, aber ich glaube, man kann es externen Java-Code als auch kompilieren.

http://java.sun.com/developer/technicalArticles/ J2SE / Desktop / scripting /

Edit: Hier ist ein relevanter Link: "Dynamic Quelle" Code in Java-Anwendungen

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