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,并且正在寻找更优雅的解决方案。
答案 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)
选择:
你可以从java调用java编译器,创建一个类,并动态调用它。对于一些行代码段来说,这是过度的。
如果您的“20条指令”都是类似的形式,并且您的词汇量有限,那么您可以创建自己的“指令集”,并通过一些调度功能来关闭它。 (这是任何语言的通用解决方案。)
如果您习惯使用更强大的语言(如Lisp),java的一些可用脚本语言也具有eval函数。
我喜欢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>