外部 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 中国語 Web サイトの他の関連記事を参照してください。