好的,所以来自大多数perl的背景,并且主要编写脏的小应用程序来自动化我的任务,我已经阅读了关于eval()的邪恶的页面,并且我总是使用散列(在perl中)。我目前正在开展一个小项目(主要是为了我和其他几个技术人员),用于创建“预制响应”电子邮件。为了允许添加,减少,编辑等,我想基本上用XML描述响应表单,并让我的应用程序解析XML并在运行时创建响应表单。我想使用Java(将它集成到我创建的现有Java工具中),并归结为一个简单的例子,我想要做的是采用一些XML:
<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反射的google结果的第一页,但我没有遇到过任何人正在寻找我正在寻找的东西(至少不是我能说的)。基本上没有反射经验,我很好奇这是否可以用它完成,或者我应该采用与Perl相同的方法,并创建一个HashMap或HashTable of Objects,并将它们绑定到一个在JFrames的Hash中输入。或者,我对那些不属于这两类的想法持开放态度。 Hash是我的备用答案,因为我已经在Perl中完成了很多次,并且我确信我可以在Java中使用它,但是如果有一个功能(如反射)就可以做到这一点任务,那么为什么不按照预定的方式去做呢?
答案 0 :(得分:0)
您在Java中无法提出的问题。它不起作用,动态语言中常见的这些技巧不是Java方式。你当然可以这样做:
JFrame frame = JFrameBuilder.buildFromTemplate("frame.xml");
您可以在其中创建一个JFrameBuilder类,该类读取XML并从中创建对象,但变量名称不能是动态的。你必须记住Java中有两个步骤。
你想要的是在步骤(1)中执行代码。现在,注释可以在编译步骤中完成(比如添加接口,实现方法等),但局部变量命名不是其中之一。
答案 1 :(得分:0)
您可以(不一定要)根据您的XML生成Java源代码,编译生成的代码,最后执行已编译的代码。如果您保存生成的.class文件并重新使用它们而不是每次运行程序时解析XML(它可以检查XML上的时间戳,并且只有在自上次代码生成后它被修改后才生成和编译),这可能会更有效。 )。