Cara Menyusun dan Memuatkan Kelas Java Luaran Secara Dinamik
Apabila mencipta program yang membolehkan pengguna menyesuaikan fungsi melalui pemalam, adalah penting untuk mempunyai keupayaan untuk menyusun dan memuatkan kelas Java luaran. Berikut ialah panduan komprehensif tentang cara untuk mencapai ini:
Menggunakan JavaCompiler
Untuk kompilasi dinamik, gunakan kelas JavaCompiler. Di bawah ialah contoh berdasarkan 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(); } }
Kod ini menunjukkan cara mencipta fail Java, menyusunnya menggunakan JavaCompiler dan memuatkan serta melaksanakan kelas yang disusun menggunakan ClassLoader tersuai. Ambil perhatian bahawa contoh ini termasuk ClassPath untuk pengkompil.
Sumber Tambahan
Atas ialah kandungan terperinci Bagaimana untuk Menyusun dan Memuatkan Kelas Java Luaran secara Dinamik menggunakan JavaCompiler?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!