Heim >Java >javaLernprogramm >Wie kann ich aus der Datenbank abgerufene Zeichenfolgen sicher in ausführbaren Java-Code kompilieren?
String-Konvertierung in kompilierbaren Java-Code
Bei der Abfrage einer Datenbank werden häufig gespeicherte Ausdrücke bereitgestellt, die innerhalb bedingter Strukturen ausgewertet werden müssen. Die Möglichkeit, diese Zeichenfolgen in kompilierbaren Java-Code zu konvertieren, ermöglicht die dynamische Ausführung benutzerdefinierter Ausdrücke. In diesem Artikel wird die mögliche Lösung mithilfe der Compiler-API von Java untersucht, aber auch die potenziellen Risiken hervorgehoben, die mit dem Kompilieren von beliebigem Code verbunden sind.
Verwendung der Java Compiler-API
Für Java 6 und höher: Die Java Compiler API bietet eine Möglichkeit, Java-Code programmgesteuert zu kompilieren. Mit der Kernkomponente JavaCompiler können Sie Quellcode im Speicher definieren und so ein Comparator-Objekt dynamisch erstellen.
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();
Nach der Kompilierung können Sie den Comparator instanziieren und die Dynamik ausführen Ausdruck:
Comparator comparator = (Comparator) Class.forName(comparableClassName).newInstance();
Vorsichtsmaßnahmen
Das obige ist der detaillierte Inhalt vonWie kann ich aus der Datenbank abgerufene Zeichenfolgen sicher in ausführbaren Java-Code kompilieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!