Frage

Also habe ich vor kurzem von den neuen JavaCompiler API in JDK 1.6 zur Verfügung. Dies macht es sehr einfach, einen String zu einer .class Datei aus laufenden Code direkt zu kompilieren:

String className = "Foo";
String sourceCode = "...";

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

List<JavaSourceFromString> unitsToCompile = new ArrayList<JavaSourceFromString>() 
    {{ 
         add(new JavaSourceFromString(className, sourceCode)); 
    }};

StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
compiler.getTask(null, fileManager, null, null, null, unitsToCompile).call();
fileManager.close();    

ByteArrayOutputStream bos = new ByteArrayOutputStream();
FileInputStream fis = new FileInputStream(className + ".class");
IOUtils.copyStream(fis, bos);

return bos.toByteArray();

Sie können greifen die Quelle zu JavaSourceFromString aus dem Javadoc .

Dies wird sehr handlich Kompilierung sourceCode zu Foo.class im aktuellen Arbeitsverzeichnis.

Meine Frage ist, : ist es möglich, direkt auf eine byte[] Array zu kompilieren, und vermeiden Sie die Unsauberkeit mit File Umgang I / O insgesamt

War es hilfreich?

Lösung

Vielleicht könnten Sie Ihre eigene javax.tools.JavaFileManager implementierende Klasse erstellen, in dem Sie Ihre eigene Implementierung von javax.tools.FileObject zurückkehren würde, die es dann schreiben würde stattdessen auf die Festplatte in den Speicher aus. Also für Ihre Unterklasse von javax.tools.FileObject Writer openWriter() throws IOException Methode würden Sie eine java.io.StringWriter zurückzukehren. Alle Methoden sollten auf ihre String Pendants umgewandelt werden.

Andere Tipps

Der Grund, dass es zu Schreib Bytecode auf einen Byte-Array keinen Standard-API ist, dass eine einzelne Java-Quelldatei kompiliert in mehreren Bytecode-Dateien führen. Zum Beispiel kann jede Quelldatei mit verschachtelten / innen / anonymen Klassen wird in mehreren Bytecode-Dateien zur Folge hat.

Wenn Sie eine eigene JavaFileManager rollen, müssen Sie mit dieser Situation fertig zu werden.

Die Demo-Anwendung, die mit dem JSR 199 API ausgeliefert hatte ein In-Memory-Kompilierung-from-String Beispiel (die in der Tat eine MemoryFileManager verwendet). haben einen Blick auf sie vielleicht hier oder Wie im Fluge kompilieren? Artikel über Java.net.

PS: Ich habe nicht alle Details, aber ich bin nicht denke, es die Fälle behandelt von Stephen C .

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