2012-04-16 44 views
1

例子--- 像SQL我們編寫SQL語句作爲字符串,然後我們執行我可以執行一個類似語言命令的字符串嗎?

strsql = "Select * from international_table "; 

現在我們做什麼我們執行該語句 同樣

我想在Java或C#

這樣的

strjavacode = "String str = \" Masdfksdja \";System.out.Println(str); " 

之後有些如何執行這個

我很想做這樣的事情,我不需要聲明變量並且多次指定值 或者語句。

+4

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html – asawyer 2012-04-16 12:42:59

+2

這還不清楚。你試圖解決什麼問題? – 2012-04-16 12:44:01

+0

它不是問題 – Trikaldarshi 2012-04-16 12:44:31

回答

1

取決於你想要的。如果執行後想讓s1和s100可用於進一步使用,那麼這根本不可能。也不可能編寫任何可以訪問任何非全局變量的代碼。

你可以做的是編寫一個類,它實現一個接口並在運行時編譯該類。然後可以使用反射來實例化這個新類的實例。如果接口提供了適當的方法,則可以在執行前,執行期間和執行後查詢此對象。您也可以使用反射訪問對象的字段。

雖然這是非常黑客,並試圖以Java不適合的方式完成的事情。如果你只想創建100個任意字符串,那麼最好使用一個數組並創建你自己的小型DSL來完成簡單的任務。

您可能希望嘗試的最後一種方法是使用在JVM上運行的腳本語言,如Jython或Groovy。 Groovy對此很棒。由於Groovy是Java的超集,因此您不必擔心有效的Java無法編譯。儘管可能會擔心的是無效的Java可能會被編譯。例如String s = 'some string'是有效的Groovy,但不是有效的Java。

使用Groovy,你可以這樣做:

import groovy.lang.GroovyShell; 

public class SomeClass { 

    public static void main(String[] args) { 
     GroovyShell shell = new GroovyShell(); 

     for (String arg : args) { 
      Object result = shell.evaluate(arg); 

      System.out.println("result is: "+result); 
     } 
    } 

} 

對於這一點,你可以有說String s1 = "hello";String s2 = "world";String combined = s1 + " " + s2;的輸入ARGS。

6

是的,有可能的語言,如Javascript和PHP,它有一個eval()函數,允許您運行任意字符串作爲代碼。

但是,您的示例將被視爲幾乎不用任何語言的功能濫用,因爲您不應該使用單獨的變量String s1直到String s10,而應該使用數組來表示通過索引可訪問的一組值。這就是陣列的用途。

Java(如C#,C++和許多其他語言)沒有此功能。你可以隨時編譯代碼,但它必須是類的一部分,這是一個非常複雜的過程。

+0

首先嚐試瞭解我的問題 – Trikaldarshi 2012-04-16 12:56:51

+1

@Photon :我完全理解你的問題。現在試着理解我的答案。 – 2012-04-16 13:00:11

+2

@Photon - 你有一個態度問題。我相信邁克爾**已經試圖理解你的問題。如果他誤解了,錯誤是你的不清楚的自我解釋。 – 2012-04-16 13:01:54

4

你認爲你可能需要eval,但是在Java中你也可以實現命令模式。這不會讓你執行任意的代碼。

interface Command { 
    void execute(); 
} 

class StringOutputCommand implements Command { 

    private final int value; 

    public StringOutpuCommand(final int newValue) { 
     this.value = newValue; 
    } 

    void execute() { 
    // do something with value 
     System.out.println(value); 
    } 

} 

// then elsewhere you could have a bunch of these command objects 
List<Command> commands = new ArrayList<Command>();  

for (int i = 0; i < 10; i++) { 
    commands.add(new StringOutputCommand(i)); 
} 

// which you could execute like this ... 
for (Command command : commands) { 
    command.execute(); 
} 
+0

困惑... **最終**變量,價值如何改變?這不應該是一個錯誤? – fireshadow52 2012-04-16 13:05:49

+0

它在構造函數 – blank 2012-04-16 13:06:23

+0

中設置好了謝謝!我現在知道了。 :) – fireshadow52 2012-04-16 13:07:36

相關問題