2013-02-23 21 views
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(); 

爲了簡單起見,我已經使用3,但我需要20條指令。更重要的是,我正在嘗試更多地瞭解Java,並且正在尋找更優雅的解決方案。

+0

是這個java還是其他? – Arpit 2013-02-23 16:15:43

+0

您應該添加一個標籤,指定這是哪種語言。 – new299 2013-02-23 16:16:34

+0

謝謝你的提示!我編輯了添加Java標籤的帖子,並指出這是一個關於Java的問題。 – 2013-02-23 16:19:45

回答

0

簡單的循環可以做你的工作:

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

數組a []是什麼? – 2013-02-23 16:27:54

+0

@ user1552868什麼是a1,a2,... – Arpit 2013-02-23 16:28:35

+0

a1,a2是字段名稱。 – 2013-02-23 16:34:29

1

什麼你要找的是「EVAL」在許多解釋語言。 Java不允許您在運行時評估源代碼。這是作爲一種編譯而不是解釋語言的屬性。

您可以通過反射或字節碼生成獲得一些功能,但這些都是高級功能,通常由開發框架或庫的人員使用,而不是日常編程的常規部分。

+1

「不允許」有點強大,因爲它能夠在運行時編譯源代碼。 – 2013-02-23 16:28:21

+0

+1反思。如果問題是拉同一類型,類似命名,但沒有索引,來自對象的變量,反射是方式。 – 2013-02-23 19:09:53

1

雖然Java本身不是腳本語言,但它確實有一個庫,javax.script,它支持帶有eval方法的腳本。當我想允許表達式作爲程序的輸入參數時,我已經使用了它。

+0

示例可以看到[這裏](http://stackoverflow.com/a/8162055/418556)&[here](http://stackoverflow.com/a/6426684/418556)&[here](http:/ /stackoverflow.com/a/7441804/418556).. – 2013-02-23 16:37:54

0

選擇:

  1. 你可以從Java調用Java編譯器,創建一個類,並動態地調用它。這是一些線條片段的矯枉過正。

  2. 如果你的「20條指令」都是類似的形式,並且你有一個有限的詞彙表,那麼你可以創建你自己的「指令集」,然後用一些調度函數關閉它。 (這是任何語言的通用解決方案。)

  3. 如果您已經習慣了Lisp等功能更強大的語言,那麼Java的一些可用腳本語言也具有eval函數。

我喜歡時髦,因爲它有兩全其美:動態和使用功能,關閉,互動性,探索性的(如標籤完成對VAR和方法),它是Java語言的一個超集,可以使用所有現有的java類和jar。易於嵌入一個常規控制檯來彈出(甚至從您的服務器)並交互地戳,檢查值等。

下面是一個評估從groovy外殼代碼的例子;從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"); 
===> [email protected] 
groovy:000> a1.getText()  // showing 
===> a1's getText() returns... 
groovy:000> b = new Binding(); 
===> [email protected] 
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); 
===> [email protected] 
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>