字符串可以转换为指令吗?

时间:2013-02-23 16:14:37

标签: java macros substitution

Java中的代码:

for (Integer x=1; x <= 3; x++) {
    y = "array[" + Integer.toString(x) + "] = a" + Integer.toString(x) + ".getText();";
    System.out.println(y);
    }

打印出来:

array[1] = a1.getText();
array[2] = a2.getText();
array[3] = a3.getText();

然而,我没有打印出字符串y,而是希望它被执行。我如何用Java做到这一点?

如果无法做到这一点,是否还有其他方法可以实现我想要的,与使用3条指令不同?

array[1] = a1.getText();
array[2] = a2.getText();
array[3] = a3.getText();

为了简单起见,我使用了3,尽管我需要20条指令。更重要的是,我正在尝试更多地了解Java,并且正在寻找更优雅的解决方案。

4 个答案:

答案 0 :(得分:1)

您正在寻找的是许多解释语言中的“eval”。 Java不允许您在运行时评估源代码。这是一种编译而非解释语言的属性。

您可以通过反射或字节码生成获得一些功能,但这些是开发框架或库的人通常使用的高级功能,而不是日常编程的常规部分。

答案 1 :(得分:1)

虽然Java本身不是脚本语言,但它确实有一个库javax.script,它支持带有eval方法的脚本。当我想允许表达式作为程序的输入参数时,我已经使用过它。

答案 2 :(得分:0)

简单的循环可以完成你的工作:

for(int i=0;i<array.length;i++){
array[i] = a[i].getText();
}

答案 3 :(得分:0)

选择:

  1. 你可以从java调用java编译器,创建一个类,并动态调用它。对于一些行代码段来说,这是过度的。

  2. 如果您的“20条指令”都是类似的形式,并且您的词汇量有限,那么您可以创建自己的“指令集”,并通过一些调度功能来关闭它。 (这是任何语言的通用解决方案。)

  3. 如果您习惯使用更强大的语言(如Lisp),java的一些可用脚本语言也具有eval函数。

  4. 我喜欢groovy,因为它具有两全其美:动态和功能使用,闭包,交互式,探索性(例如,变量和方法上的制表符完成),并且是java语言的超集,可以使用您现有的所有内容java类和jar。易于将常规控制台嵌入弹出窗口(甚至从您的服务器)并以交互方式查看,检查值等。

    下面是一个评估groovy shell代码的例子;从Java调用它实际上是一样的; 见http://groovy.codehaus.org/Embedding+Groovy

    $ groovysh
    Groovy Shell (1.8.4, JVM: 1.6.0_24)
    Type 'help' or '\h' for help.
    ---------------------------------------------------------------------------------------------
    groovy:000> class Athing {  String name; public Athing(String name){ this.name=name; }; String getText() { return name + "'s getText() returns..."; }; }
    ===> true
    groovy:000> a1 = new Athing("a1"); a2 = new Athing("a-two");  a3 = new Athing("A_3"); 
    ===> Athing@6e7616ad
    groovy:000> a1.getText()        // showing 
    ===> a1's getText() returns...
    groovy:000> b = new Binding();
    ===> groovy.lang.Binding@2c704cf5
    groovy:000> array = [ 'not','set','yet' ]   // create an array for return values
    ===> [not, set, yet]
    groovy:000> b.setVariable( "a1", a1 ); b.setVariable( "a2", a2 ); b.setVariable( "a3", a3 ); b.setVariable( "array", array );
    ===> null
    groovy:000> shell = new GroovyShell(binding);
    ===> groovy.lang.GroovyShell@24fe2558
    groovy:000> code = "array[1] = a1.getText();\n" + "array[2] = a2.getText();\n" + "array[3] = a3.getText();\n";
    ===> array[1] = a1.getText();
    array[2] = a2.getText();
    array[3] = a3.getText();
    
    groovy:000> array                        // value of array before
    ===> [not, set, yet]
    groovy:000> shell.evaluate( code );      // evaluate the string of code we were given
    ===> A_3's getText() returns...
    groovy:000> array
    ===> [not, a1's getText() returns..., a-two's getText() returns..., A_3's getText() returns...]
    groovy:000>