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 ?
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!