繁体   English   中英

Java:具有挑战性的反思-动态字段和运算符

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM