3

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();

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

4

4 回答 4

1

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

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

于 2013-02-23T16:22:40.693 回答
1

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

于 2013-02-23T16:29:51.730 回答
0

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

for(int i=0;i<array.length;i++){
array[i] = a[i].getText();
}
于 2013-02-23T16:19:09.230 回答
0

选择:

  1. 你可以从java调用java编译器,创建一个类,动态调用。这对于几行代码片段来说太过分了。

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

  3. 如果您使用过 Lisp 等功能更强大的语言,一些可用的 java 脚本语言也有 eval 函数。

我喜欢 groovy,因为它两全其美:动态和功能使用、闭包、交互式、探索性(例如,变量和方法上的选项卡完成),并且是 java 语言的超集,可以使用所有现有的 java 类和罐子。易于嵌入一个 groovy 控制台以弹出(甚至从您的服务器)并交互式地四处浏览、检查值等。

下面是从 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> 
于 2013-02-23T19:01:49.463 回答