首頁 > Java > java教程 > 如何使用JavaCompiler動態編譯和載入外部Java類別?

如何使用JavaCompiler動態編譯和載入外部Java類別?

DDD
發布: 2024-12-15 21:33:10
原創
342 人瀏覽過

How to Dynamically Compile and Load External Java Classes using JavaCompiler?

如何動態編譯和載入外部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 API](https://docs.oracle.com/javase /7/docs/api/javax/tools/JavaCompiler.html)
  • [類別載入器API](https://docs.oracle.com/javase/7/docs/api/java/lang/ ClassLoader.html)

以上是如何使用JavaCompiler動態編譯和載入外部Java類別?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板