Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中评估自定义输入条件_Java_Regex_If Statement - Fatal编程技术网

在Java中评估自定义输入条件

在Java中评估自定义输入条件,java,regex,if-statement,Java,Regex,If Statement,简介 嗨,我目前正在研究一个导入框架。用户将使用该框架将大量excel表格中的数据映射到系统中的实体。某些值是否需要映射到实体取决于文件中某些值的条件。它是一个用Java(Javaservlet)构建的web应用程序 切中要害 系统用户需要向系统提供自定义条件,如: CELLD4==“你好,世界” 我的问题是:如何将CELLD4==“Hello world”条件作为字符串提供给系统,并让系统将其解释为if语句,如: if (CELLD4 == "Hello world") {execute s

简介

嗨,我目前正在研究一个导入框架。用户将使用该框架将大量excel表格中的数据映射到系统中的实体。某些值是否需要映射到实体取决于文件中某些值的条件。它是一个用Java(Javaservlet)构建的web应用程序

切中要害

系统用户需要向系统提供自定义条件,如:

CELLD4==“你好,世界”
我的问题是:如何将
CELLD4==“Hello world”
条件作为字符串提供给系统,并让系统将其解释为
if
语句,如:

if (CELLD4 == "Hello world") {execute something}

其他人所做的是从双等号(
==
)之前和双等号之后提取两个值,然后执行等于检查以检查值是否相同。但似乎有一种更好、更简单的方法可以做到这一点。对于如何让系统最好地解释来自系统用户的自定义条件输入,谁对我有建议?

如果我理解正确,您可以使用ScriptEngine实现它,即:

public static void main(String[] argv) throws Exception {
    ScriptEngineManager mgr = new ScriptEngineManager();
    ScriptEngine engine = mgr.getEngineByName("JavaScript");
    String expression2 = "CELLD4.equalsIgnoreCase(\"Hello world\")";

    Map<String, Object> map = new HashMap<>();
    map.put("CELLD4", getCELLD4());

    engine.setBindings(new SimpleBindings(map), ScriptContext.ENGINE_SCOPE);
    if ((boolean) engine.eval(expression2)) {
        System.out.println("YAY");
    } else {
        System.out.println("NAY");
    }
}

public static String getCELLD4() {
    return "Hello World";
}
publicstaticvoidmain(字符串[]argv)引发异常{
ScriptEngineManager mgr=新建ScriptEngineManager();
ScriptEngine=mgr.getEngineByName(“JavaScript”);
字符串表达式2=“CELLD4.equalsIgnoreCase”(“Hello world\”);
Map Map=newhashmap();
put(“CELLD4”,getCELLD4());
setBindings(新的SimpleBindings(map)、ScriptContext.engine\u范围);
if((布尔)引擎评估(表达式2)){
System.out.println(“耶”);
}否则{
系统输出打印号(“不”);
}
}
公共静态字符串getCELLD4(){
返回“你好世界”;
}
输出将是
YAY


也许有更好的解决方案,因为这需要一些古怪的东西。当然,您仍然需要以某种方式解析表达式中传递的变量并将其绑定到某个对象。

我认为上述解决方案是最好的方法,因为必须对CELLD4进行评估。如果我理解正确,您只需将
字符串
转换为代码即可。也许你可以检查一下。getEngineByName()的作用是什么?它调用javascript引擎?这是否意味着它将输入字符串解释为javascript语法?它直接在JVM上运行javascript代码,是的,它可以将输入解释为js语法。我不确定的是,如果使用Java和JS中都存在的函数,那么优先级顺序是什么。在给出的示例中,我使用了JS中不存在的
equalsIgnoreCase()
,它使用了Java对应项。如果对独占的JS func执行相同的操作,同样的情况也会发生,但是当它们以两种语言存在时,我不确定。因为您似乎想要字符串比较,所以这应该不是问题。