Conversion de chaîne en code Java compilable
L'interrogation d'une base de données fournit souvent des expressions stockées qui nécessitent une évaluation dans des structures conditionnelles. La possibilité de convertir ces chaînes en code compilable Java permet l'exécution dynamique d'expressions personnalisées. Cet article explore la solution potentielle utilisant l'API du compilateur Java, mais met en évidence les risques potentiels liés à la compilation de code arbitraire.
Utilisation de l'API du compilateur Java
Pour Java 6 et supérieur, l'API Java Compiler offre un moyen de compiler du code Java par programme. Le composant principal, JavaCompiler, vous permet de définir le code source en mémoire, offrant la possibilité de créer dynamiquement un objet Comparator.
String comparatorClassName = ...; // Random name for comparison class String expression = ...; // Retrieved database expression String source = "public class " + comparatorClassName + " implements Comparable<" + comparableClassName + "> {" + " public int compare(" + comparableClassName + " a, " + comparableClassName + " b) {" + " return " + expression + ";" + " }" + "}";
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); Writer out = null; // Output writer Iterable<? extends JavaFileObject> compilationUnits = new ArrayList<>(); compilationUnits.add(new SimpleJavaFileObject() { /* Details for loading source String */ }); compiler.getTask(out, null, null, null, null, compilationUnits).call();
Une fois compilé, vous pouvez instancier le Comparator et exécuter l'expression dynamique. :
Comparator comparator = (Comparator) Class.forName(comparableClassName).newInstance();
Précautions
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!