Maison >Java >javaDidacticiel >Comment puis-je convertir une chaîne en code Java compilable et l'utiliser pour la génération de code dynamique ?

Comment puis-je convertir une chaîne en code Java compilable et l'utiliser pour la génération de code dynamique ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-05 18:15:12783parcourir

How Can I Convert a String to Compilable Java Code and Use It For Dynamic Code Generation?

Conversion de code compilable de chaîne en Java

Pouvez-vous convertir une chaîne en code Java qui se compile ? Il s'agit d'une requête courante pour les développeurs qui souhaitent générer dynamiquement du code basé sur une entrée externe.

Récupération et évaluation de base de données

Vous souhaitez récupérer une expression comparative à partir d'une base de données et évaluez-le dans une structure conditionnelle. Pour ce faire, Java 6 propose l'API Java Compiler. Cette API inclut la classe JavaCompiler.

Construction et compilation de code

En mémoire, vous pouvez construire le code source de votre objet Comparator. Considérez le code suivant, bien qu'il n'ait pas été testé en raison des limitations de la plate-forme :

String comparableClassName = ...; // the class name of the objects you wish to compare
String comparatorClassName = ...; // something random to avoid class name conflicts
String source = "public class " + comparatorClassName + " implements Comparable<" + comparableClassName + "> {" +
                "    public int compare(" + comparableClassName + " a, " + comparableClassName + " b) {" +
                "        return " + expression + ";" +
                "    }" +
                "}";

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

// Please refer to the JavaCompiler JavaDoc page for examples of the following objects (most of which can remain null)
Writer out = null;
JavaFileManager fileManager = null;
DiagnosticListener<? super JavaFileObject> diagnosticListener = null;
Iterable<String> options = null;
Iterable<String> classes = null;
Iterable<? extends JavaFileObject> compilationUnits = new ArrayList<? extends JavaFileObject>();
compilationUnits.add(
    new SimpleJavaFileObject() {
        // See the JavaDoc page for more details on loading the source String
    }
);

compiler.getTask(out, fileManager, diagnosticListener, options, classes, compilationUnits).call();

Comparator comparator = (Comparator) Class.forName(comparableClassName).newInstance();

Vous devez ensuite stocker l'expression Java appropriée dans le champ de base de données approprié, en faisant référence aux variables "a" et "b".

Attention

Bien que cette approche permette la génération de code dynamique, la compilation de code Java arbitraire présente des problèmes de sécurité. Il est crucial de mettre en œuvre des mesures de protection pour empêcher l'exécution de code malveillant.

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