外部 Java クラスの動的コンパイルとロード
概要
特定のシナリオでは、 Java クラスを動的にコンパイルして外部ソースからロードするには必要になります。この記事は、このタスクを達成するための包括的なソリューションを提供することを目的としています。
JavaCompiler: 動的コンパイルの鍵
Java Development Kit (JDK によって提供される) JavaCompiler クラス) は、Java ソース コードをクラス ファイルに動的にコンパイルするための強力なメカニズムを提供します。この機能を利用するには、次の手順に従います。
クラスの読み込みと実行
コンパイルが正常に完了すると、動的に生成されたクラスは、カスタム クラスを使用して Java 仮想マシン (JVM) にロードできます。ローダー:サンプル コード
次のコード スニペットは、動的コンパイルとロードの実装例を示しています。
import javax.tools.*; import java.io.File; 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 DynamicCompiler { public static void main(String[] args) { // Create the source code String sourceCode = ...; // Compile the source code compile(sourceCode); // Load and execute the compiled class loadAndExecute(); } private static void compile(String sourceCode) { // Create a diagnostic collector DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<>(); // Create a file for the source code File sourceFile = ...; // Write the source code to the file try (Writer writer = new FileWriter(sourceFile)) { writer.write(sourceCode); } catch (IOException e) { e.printStackTrace(); } // Create the compilation task JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); StandardJavaFileManager fileManager = compiler.getStandardFileManager(diagnostics, null, null); CompilationUnit task = compiler.getTask(null, fileManager, diagnostics, null, null, fileManager.getJavaFileObjectsFromFiles(Arrays.asList(sourceFile))); // Compile the source code task.call(); // Check for errors for (Diagnostic<? extends JavaFileObject> diagnostic : diagnostics.getDiagnostics()) { System.out.println(diagnostic.getMessage(null)); } } private static void loadAndExecute() { // Create a custom class loader URLClassLoader classLoader = new URLClassLoader(new URL[] {new File(".").toURI().toURL()}); // Load the compiled class Class<?> loadedClass = classLoader.loadClass("..."); // Create an instance of the loaded class Object instance = loadedClass.newInstance(); // Execute the desired method ... } }
結論
機能を活用することでJavaCompiler を使用すると、外部ソースから Java クラスを動的にコンパイルしてロードすることができます。このアプローチは、ランタイム拡張機能が必要な状況に柔軟でカスタマイズ可能なソリューションを提供します。以上が実行時に外部 Java クラスを動的にコンパイルしてロードするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。