在Java中实现eval()

时间:2011-12-29 10:51:02

标签: java eval

我的问题与Java中不存在函数eval()的现象有关。在互联网上阅读了一些内容之后,我发现我能做的最好的事情就是创建自己的解析器作为Java函数。但是怎么做呢?我实际需要的是一个函数,它读取上面数组的第一列并一个接一个地返回所有这些值。但请注意,这些值是字符串存储在String数组中,因此是字符串,但它们代表不同类型的对象,比如X1,X2,X3,X3等。

如果我设法读取这个String值,比如说x1,作为一个对象,比如说X1,那么我就可以用它来调用一些与对象有关的函数,比如x1.classifyInstance(等等等等等等等等等等)。 );

希望有人知道如何解决这个问题......!

编辑:此主题与我的第一篇帖子here密切相关!

3 个答案:

答案 0 :(得分:2)

您可以使用eval()类的ScriptEngine方法将字符串评估为javascript字符串

ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("js");        
Object result = engine.eval("4*5");
System.out.println("..result..."+String.valueOf(result));

结果= ..result...20.0

答案 1 :(得分:1)

自己构建Java编译器是一项了不起的工作。基本上,有三种选择:

  1. 使用ToolProvider.getSystemJavaCompiler()。 How to create an object from a string in Java (how to eval a string)?的第二个答案也使用了这个,可能会让你知道如何使用它。
  2. 使用第三方java编译器,如Janino,Java Compiler http://docs.codehaus.org/display/JANINO/Home
  3. 使用ScriptEngineManager使用Javascript(或其他语言)编译器,并将Javascript数组转换为Java。

答案 2 :(得分:0)

为了能够在Java中调用对象上的方法,您需要此对象的实例,并且需要使用适当的类型声明变量。唯一的另一种方法是使用反射来调用方法。 Java与JavaScript不同:它是强类型的,并且没有鸭子输入。

你应该做的是让所有这些对象实现一个通用的接口:

public interface Classifyable {
    void classify();
}

并使用以下代码(您需要处理异常,但我省略了它们):

for (String s : stringArray) {
    // s is the class name of the object to instantiate, right?
    Class<?> clazz = Class.forName(s);
    Classifyable c = (Classifyable) clazz.newInstance(); // calls the no-arg constructor
    c.classify();
}
相关问题