出于对java或c的好奇,我想问一下,是否可以将任何文本输入转换为一些可执行语句?
例如,假设我有一个包含如下信息的文本文件:
“类别:,参数:32”
现在用c或java我想读这个文件并做如下操作:
new Abc(32);
我该怎么做?读值很容易,但是如何创建一个类呢?有标准的方法吗?在c++和java中?
主要的好奇心来自于java中那些将对象属性存储在xml文件中并通过读取xml文件来创建对象的持久性机制,它们是如何做到的?这和我上面要求的是分开的吗?edit:这与标准的java序列化不同,我认为这是一种长期持久化的解决方案,对象实现可以改变,而不是序列化,它们将属性(包括用于在运行时创建对象的xml文件中的执行语句)存储在xml文件中。
8条答案
按热度按时间cpjpxq1n1#
创建解析器。对于java和c++,我建议您使用antlr。
对于解析器生成时未知的类,可能还需要使用反射api。
kx1ctssn2#
如果您的目标是接收任何文本输入并运行任意命令,那么可以从java6编译器api开始查看jvm(http://java.sun.com/javase/6/docs/api/javax/tools/package-summary.html)或jsr 223(http://java.sun.com/developer/technicalarticles/j2se/desktop/scripting).
如果您的目标是存储和检索文本文件中的信息,请查看协议缓冲区(http://code.google.com/p/protobuf/)或者java序列化api(http://www.javaworld.com/javaworld/jw-07-2000/jw-0714-flatten.html).
yeotifhr3#
对于c来说,您所建议的许多操作都可以使用预编译器的宏功能来完成。对于java来说,使用反射来实现上述示例并不困难。不过,你的例子很少。你能给出一个用例来说明为什么你会有兴趣这么做吗?
如果您只是在寻找一种机制来设置程序的初始状态,那么您想要寻找的是关于控制反转的信息。在java中,spring是一个很大的ioc库。我不知道会有什么c等价物。我怀疑c++缺乏反射功能会使ioc变得更加困难。
编辑:我以前没有读过你的最后一段。与xml之间的序列化可以通过多种不同的方式完成,但是在java中,如果您只想序列化和反序列化对象的状态,jaxb是一个允许这样做的库。
xnifntxz4#
Java6支持脚本语言,这些语言可以使用您所描述的传递字符串进行“填充”。
有一个javascript引擎和一个beanshell引擎可用,但我不确定他们是否可以动态创建新类。所以你需要做的是找到一个你喜欢的脚本语言
https://scripting.dev.java.net/
安装并使用:)
kx7yvsdv5#
您可以根据语法解析输入(还记得yacc吗?),并将语义操作附加到派生规则。这是一个非常遥远的描述编译器做什么。
lmyy7pcs6#
你首先需要解析你的迷你语言。所以(如前所述)antlr或javacc为您的语言创建解析器。
之后,您需要使用“解释器”或目标语言的元编程特性。对于java,您希望从反射开始,如果您确实需要反射,那么稍后将转到字节码生成。
dphi5xsq7#
在java中,您可以这样做:
ct2axkht8#
[c++答案]
你不能那样做。您需要在运行时解析/编译c行,相信我,这不是您想要处理的事情。
但是,如果您是从“java中那些将对象属性存储在xml文件中的持久性机制”中获得的,那么您要寻找的关键字就是序列化。许多序列化技术和库可用于c,例如boost::serialization。