字符串到 Java 可编译代码转换
你能将字符串转换为可编译的 Java 代码吗?对于想要根据外部输入动态生成代码的开发人员来说,这是一个常见的查询。
数据库检索和评估
您希望从数据库检索比较表达式并在条件结构内对其进行评估。为了实现这一点,Java 6 提供了 Java 编译器 API。此 API 包含 JavaCompiler 类。
代码构造和编译
在内存中,您可以构造 Comparator 对象的源代码。考虑以下代码,尽管由于平台限制尚未对其进行测试:
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();
然后,您必须将适当的 Java 表达式存储在相关数据库字段中,引用变量“a”和“b”。
注意
虽然这种方法允许动态代码生成,但编译任意 Java 代码会带来安全性的担忧。实施保护措施以防止恶意代码执行至关重要。
以上是如何将字符串转换为可编译的 Java 代码并将其用于动态代码生成?的详细内容。更多信息请关注PHP中文网其他相关文章!