2009-09-30 35 views
1

好的,所以來自主要是perl的背景,並且主要是編寫髒的小應用程序來自動執行我的任務,我已經閱讀了關於eval()的弊端,而且我總是使用散列(在perl中)。我目前正在製作一個小型項目(主要是爲了我和其他一些技術人員),以創建「預先回復」電子郵件。爲了允許添加,減少,編輯等,我希望本質上描述XML中的響應表單,並讓我的應用程序解析XML並在運行時創建響應表單。我想使用Java(它集成到我創建了一個現有的Java工具),並歸結爲一個簡單的例子,我想要做的是採取一些XML,如:java:使用變量的值作爲對象名稱(而不是eval()方式)

<Form Name="first" Title="Title!"> 
    <Label Name="before">Your Request:</Label> 
    <Textbox Name="input"/> 
    <Label Name="after">has been completed.</Label> 
    <Output>%before%%input%%after%</Output> 
</Form> 
<Form Name="second"> 
... 

和解析我想創建一個名爲first的JFrame,它包含一個名爲JLabel的明顯的文本,然後是一個文本框,然後是另一個JLabel ......您可以得到這個想法(我最終希望使用輸出標籤來控制響應被格式化)。

我可以解析XML,並獲得該元素的名稱等,但我不知道如何與一個名稱是一個變量的值,有效的實例化對象:

JFrame $(thisNode.getAttributes().getNamedItem("Name").getNodeValue()) = new JFrame(thisNode.getAttributes().getNamedItem("Title").getNodeValue());

我已經基本上閱讀了關於java反射的谷歌結果的整個第一頁,但我還沒有遇到任何人做我正在尋找的東西(至少不是我可以告訴)。基本上沒有反射經驗,我很好奇這是否可以使用它來完成,或者如果我應該採用與Perl中相同的方法,並創建對象的HashMap或HashTable,並將它們綁定到進入一堆JFrames。或者,我願意接受那些不屬於這兩類的想法。哈希是我的一個備用答案,因爲我已經在Perl中做了很多次,我確信我可以使它在Java中工作,但是如果有一個特性(如反射)可以做到這一點任務,那麼爲什麼不按照它打算完成的方式去做?

回答

0

你問的東西在Java中是不可能的。它並不是那種方式,而這些在動態語言中很常見的技巧並不是Java方式。你當然可以這樣做:

JFrame frame = JFrameBuilder.buildFromTemplate("frame.xml"); 
在那裏你創建一個JFrameBuilder類讀取XML,並從它創建一個對象,但變量名不能是動態

。你必須記住,Java中有兩個步驟。

  1. Java源文件被編譯成字節碼;
  2. 字節碼由Java解釋器(JVM)讀取並執行。

你想要的是本質上要求在步驟(1)中執行代碼。現在,註釋可以在編譯步驟中完成任務(如添加接口,實現方法等),但局部變量命名不是其中的一個。

0

您可以(不一定應該)根據您的XML生成Java源代碼,編譯生成的代碼,最後執行編譯後的代碼。如果保存生成的.class文件並重新使用它們,而不是在每次運行程序時都解析XML,這可能會更有效(它可以檢查XML上的時間戳,並且只有在自上一代碼生成後修改時才生成和編譯) )。

相關問題