Caricamento codice sorgente esterna e li utilizzano internamente (da ri-compilazione o qualcosa del genere)

StackOverflow https://stackoverflow.com/questions/1981750

Domanda

C'è un modo nell'uso di codice sorgente memorizzati esternamente e di caricarle in un programma Java, in modo che possa essere utilizzato da essa?

Vorrei avere un programma che può essere modificato senza modificare il codice sorgente completo e che questo è ancora possibile senza la compilazione di questo ogni volta. Un altro vantaggio è che posso cambiare parti del codice come voglio.

Naturalmente devo avere interfacce in modo che sia possibile inviare i dati in questo e ottenere di nuovo nel programma sorgente fissa di nuovo.

E, naturalmente, dovrebbe essere più veloce di un sistema di interpretazione pura.

Quindi, c'è un modo nel fare questo come un ulteriore compilazione di queste parti di codice sorgente esterna e un inizio del programma, dopo che questo è fatto?

Grazie in anticipo, Andreas:)

È stato utile?

Soluzione

È necessario il javax.tools API per questo. Pertanto, è necessario avere almeno il JDK installato per farlo funzionare (e lasciate che il vostro punto di IDE al posto del JRE). Ecco un esempio di base kickoff (senza adeguata eccezione e manipolazione codifica solo per fare l'esempio di base meno opaco, tosse ):

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);
}

Questo dovrebbe stampare test in stdout, come fatto dal inizializzatore statico nel codice sorgente di prova. Ulteriore uso sarebbe più facile se tali classi implementa una certa interfaccia che è già nel percorso classe. In caso contrario, è necessario coinvolgere il API Reflection per accedere e richiamare i metodi / campi.

Altri suggerimenti

In Java 6 o versioni successive, è possibile ottenere l'accesso al compilatore attraverso il pacchetto javax.tools. ToolProvider.getSystemJavaCompiler () otterrà un javax.tools .JavaCompiler , che è possibile configurare per compilare il sorgente. Se si utilizzano versioni precedenti di Java, è ancora possibile ottenere a esso attraverso l'interfaccia com.sun.tools.javac.Main interna, anche se è molto meno flessibile.

java6 ha un'API di scripting. L'ho usato con JavaScript, ma credo che si può avere compilare codice Java esterno pure.

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

Edit: Ecco un link più rilevante: codice "fonte dinamica" nelle applicazioni Java

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top