2011-12-02 50 views
2

在開發軟件期間,我需要執行一條語句,該語句存儲爲string。舉例來說:在運行期間動態添加組件到JPanel

String test = " int a; "; 

在上面的例子中,我想聲明一個變量a

另一個例子是MySQL的語句從string執行:

String sqlquery ="SELECT * FROM FULLDETAILS WHERE Classname = 'test' "; 
      con = (Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/executable","root","mysql"); 
      st = (Statement) con.createStatement(); 
      rs = st.executeQuery(sqlquery); 
         ^

我想要實現這個對於Java語句了。有沒有辦法?

編輯:

鑑於上述情況就是一個例子,真實的情況是非常不同的(但基本上,我需要的東西是一樣的)。

這種情況是,我有一些jpanels,我想向它添加一些組件,比如說label,標籤的內容是從數據庫中獲得的,並且它的唯一情況是在運行時我可以知道我應該添加組件的面板。在這種情況下,我不能按名稱指定panel,說如果我有10 jpanels,我以爲我可以使用這樣的字符串:

String test = " jpanel " + i + " .add(jlabel1); " ; 

將導致測試值將是:

jpanel1.add(jlabel1); // provided i is a string with value of i is 1 

現在我想執行此操作。有沒有辦法?

+4

你爲什麼要這麼做? – yannis

+0

不簡單。 AFAIK,標準JRE不包括編譯器。此外,所有本地變量可能有其他名稱。如果這是可能的,可能只能通過從字符串創建一個新類。 – fuz

+0

@YannisRizos請參閱編輯!我不確定我是否成功傳達了這個想法,但相信我需要這個:D有沒有辦法? – COD3BOY

回答

8

也許這不是你想要的,但你可以小心地使用Java的 Reflection API來調用方法或其他基於字符串的東西。

SQL語句有很大不同,因爲它們並非真正在Java內部執行,而是由JDBC連接另一端的其他SQL Server處理。

某處,你應該把所有的面板的初始列表或在啓動時創建或什麼,如果我是正確的? 你應該去找到一個數據結構來保存它們(例如,一個HashMap比較合適),添加所有面板並使用一個鍵將它們取回並添加標籤。

粗糙例如:

Map<Integer, Panel> panelMap = ... 
for(int i = 1; i < 10; i++) { 
    Panel panel = new Panel(); 
    panelMap.put(i, panel); 
} 

panelMap.get(1).addLabel(labelForPanel1); (for all labels) 

變量名是或多或少不相關的程序來執行時,它們然後所有對象。希望適合您的需求更多...或者,現在我完全錯過了:)

+0

請參閱編輯問題! :) – COD3BOY

3

你似乎想要做的就像是一個Java的eval()函數。據我所知,Java不提供一個,但它支持腳本語言,所以你可能想回到那個。

我在StackOverflow上找到了一個question。看到那裏的答案。或者,查看JEXL。這是一個Apache項目,之前我已經在一個項目中成功地使用了它。