Maison >Java >javaDidacticiel >Comment compiler et charger dynamiquement des classes Java externes à l'aide de JavaCompiler ?
Comment compiler et charger dynamiquement des classes Java externes
Lors de la création de programmes permettant aux utilisateurs de personnaliser les fonctionnalités via des plugins, il est essentiel d'avoir le possibilité de compiler et de charger des classes Java externes. Voici un guide complet sur la façon d'y parvenir :
Utilisation de JavaCompiler
Pour une compilation dynamique, utilisez la classe JavaCompiler. Vous trouverez ci-dessous un exemple basé sur 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(); } }
Ce code montre comment créer un fichier Java, le compiler à l'aide de JavaCompiler, puis charger et exécuter la classe compilée à l'aide d'un ClassLoader personnalisé. Notez que cet exemple inclut un ClassPath pour le compilateur.
Ressources supplémentaires
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!