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 à l'aide de JavaCompiler ?

DDD
DDDoriginal
2024-12-15 21:33:10342parcourir

How to Dynamically Compile and Load External Java Classes using 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

  • [API JavaCompiler](https://docs.oracle.com/javase /7/docs/api/javax/tools/JavaCompiler.html)
  • [ClassLoader API](https://docs.oracle.com/javase/7/docs/api/java/lang/ClassLoader.html)

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn