【问题标题】:Evaluating code at runtime in Java [duplicate]在Java中在运行时评估代码[重复]
【发布时间】:2012-01-04 20:50:42
【问题描述】:

可能重复:
Is there a java equivalent of the python eval function?

有一个字符串,类似于String str = "if a[0]=1 & a[1]=2"。如何在真实的 IF THEN 表达式中使用此字符串?例如:

for (Integer[] a : myNumbers) {
   if a[0]=1 & a[1]=2 {  // Here I'd like to use the expression from str
      //...
   }
}

【问题讨论】:

  • 这是不可能的。您必须实现一个表达式求值器并将其与数组一起提供,因为求值器无法访问局部变量。您可能正在尝试使用过于复杂或不合适的解决方案来解决问题。您要解决的更高层次的问题是什么?
  • 是的,它只适用于动态语言,比如 JavaScript。
  • 您可以编写自己的解释器,但不能将字符串数据“输入”到 if 关键字中
  • 仅仅因为答案是“它不能完成”并不意味着这个问题应该这么快就被否决。
  • 可以做到——只是不可取。如果您想了解更多信息,请参阅下面的答案。我相信,这里问题背后的动机比本案的答案更重要。

标签: java string if-statement


【解决方案1】:

Java 不是支持动态评估的脚本语言(尽管它支持脚本执行)。我会挑战你检查你正在尝试做的事情是否在 Java 中以正确的方式完成。

有两种常见的方法可以解决这个问题,如下所示。但是,当涉及到应用程序的运行时,它们会对性能产生重大影响。


脚本执行

您可以启动 ScriptEngine,构建 ScriptContext,用 Javascript 或其他语言执行片段,然后读取评估结果。


解析

您可以构建一个词法解析器来分析字符串并将其转换为您想要执行的操作。在 Java 中,我建议您查看 JFlex。

【讨论】:

    【解决方案2】:

    我认为你不能按照你的要求去做。

    你的 java 似乎也没有多大意义。这样的事情会更有意义:

    for (Integer a : myNumbers) {
       if (a.equals(Integer.valueOf(1))){
          //...
       }
    }
    

    但是你可以说:

    if("hello".equals("world")){
        //...
    }
    

    你可以建立一个字符串:

    String str = "if "+a[0]+"=1 & "+a[1]+"=2"
    

    你可以把它放在一起说:

    String str = "if "+a[0]+"=1 & "+a[1]+"=2"
    if(str.equals("if 1=1 & 2=2")){
        //...
    }
    

    但我认为你可能只是想以错误的方式做某事

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-29
      • 1970-01-01
      • 1970-01-01
      • 2020-11-29
      • 2011-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多