如何動態編譯和載入外部Java 類別
在建立允許使用者透過外掛程式自訂功能的程式時,必須擁有編譯和載入外部Java 類別的能力。以下是有關如何實現此目標的綜合指南:
使用 JavaCompiler
對於動態編譯,請使用 JavaCompiler 類別。以下是基於 JavaDocs 的範例:
import javax.tools.*; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.Writer; import java.net.URL; import java.net.URLClassLoader; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class DynamicCompilation { public static void main(String[] args) { // Write the class to a file File helloWorldJava = new File("testcompile/HelloWorld.java"); ... // Compile the file DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<>(); JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); StandardJavaFileManager fileManager = compiler.getStandardFileManager(diagnostics, null, null); // Set the classpath List<String> optionList = new ArrayList<>(); optionList.add("-classpath"); optionList.add(System.getProperty("java.class.path") + File.pathSeparator + "dist/InlineCompiler.jar"); Iterable<? extends JavaFileObject> compilationUnit = fileManager.getJavaFileObjectsFromFiles(Arrays.asList(helloWorldJava)); JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager, diagnostics, optionList, null, compilationUnit); if (task.call()) { // Load and execute the compiled class URLClassLoader classLoader = new URLClassLoader(new URL[]{new File("./").toURI().toURL()}); Class<?> loadedClass = classLoader.loadClass("testcompile.HelloWorld"); Object obj = loadedClass.newInstance(); if (obj instanceof DoStuff) { DoStuff stuffToDo = (DoStuff) obj; stuffToDo.doStuff(); } } else { ... } fileManager.close(); } public static interface DoStuff { public void doStuff(); } }
此程式碼示範如何建立 Java 文件,使用 JavaCompiler 編譯它,以及使用自訂 ClassLoader 載入和執行編譯後的類別。請注意,此範例包含編譯器的 ClassPath。
其他資源
以上是如何使用JavaCompiler動態編譯和載入外部Java類別?的詳細內容。更多資訊請關注PHP中文網其他相關文章!