字符串转换为可编译的 Java 代码
查询数据库通常会提供需要在条件结构中求值的存储表达式。将这些字符串转换为 Java 可编译代码的能力可以动态执行自定义表达式。本文探讨了使用 Java 编译器 API 的潜在解决方案,但强调了编译任意代码所涉及的潜在风险。
使用 Java 编译器 API
对于 Java 6 及更高版本, Java 编译器 API 提供了一种以编程方式编译 Java 代码的方法。核心组件JavaCompiler允许您在内存中定义源代码,提供动态创建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();
编译后,您可以实例化Comparator并执行动态表达式:
Comparator comparator = (Comparator) Class.forName(comparableClassName).newInstance();
注意事项
以上是如何安全地将数据库检索的字符串编译为可执行的 Java 代码?的详细内容。更多信息请关注PHP中文网其他相关文章!