JavaCompiler von JDK 1.6: Wie schreibt Klasse Bytes direkt an byte [] Array?
-
22-09-2019 - |
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
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 .