[英]Java: Challenging Reflection - Dynamic Fields and Operators
我在表中建模了数据,查询时可能会返回如下结果集:
+----------+-----------------+-----------+--------+-----------+----------+-------+
| subgroup | parent_subgroup | condition | field | field_pos | operator | value |
+----------+-----------------+-----------+--------+-----------+----------+-------+
| 0 | NULL | OR | Field1 | 4 | equal | A |
| 1 | 0 | AND | Field2 | 9 | equal | B |
| 1 | 0 | AND | Field3 | 20 | equal | C |
+----------+-----------------+-----------+--------+-----------+----------+-------+
这将得出布尔表达式:
Field1 = A OR (Field2 = B AND Field3 = C)
基本上,我想制造在运行时执行的代码行。 刚才说的听起来很疯狂。 我宁愿使用像PHP这样的弱类型语言来执行此操作,但这必须发生在Java领域。
左两列形成一个邻接表,field_pos表示将与之进行比较的字符串数组中的索引。
因此,在Java中,这需要变成:
String[] fields = {"1", "2", "3", ... "n"};
if (fields[4].equals("A") || (fields[9].equals("B") && fields[20].equals("C"))) {
return true;
}
我认为Java反射会有所帮助,但不知道如何使它变得优雅并且没有条件。 有任何想法吗?
最终使用GroovyShell。 这是我的沙箱:
package com.jonas.groovy;
import groovy.lang.Binding;
import groovy.lang.GroovyShell;
public class GroovySandbox {
public static void main(String[] args) {
String toEvaluate = "'string' == 'string' && ('string' == 'String' || 'a' == 'N' || true)";
System.out.println(evalFilter(toEvaluate));
toEvaluate = "Calendar.getInstance().get(Calendar.DAY_OF_WEEK) == Calendar.WEDNESDAY";
System.out.println(evalFilter(toEvaluate));
}
public static boolean evalFilter(String expression){
GroovyShell shell=new GroovyShell(new Binding());
Object value=shell.evaluate(expression);
if (!(value instanceof Boolean)) {
throw new RuntimeException("Boolean value expected out of expression: " + expression);
}
return (Boolean)value;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.