2009-09-30 211 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上的时间戳,并且只有在自上一代码生成后修改时才生成和编译) )。

相关问题