xml如何使用反射API查找字段变量或Java方法
我正在尝试提出一种算法,允许我将一个Java类编组为XML,而无需创建该类的对象(这就是问题所在,使用我现有的工具非常复杂)。我必须从日志文件中读取数据,并将其转换为XML文件。 日志文件中的示例:
2206:org.powertac.common.RandomSeed::4::init::TariffMarket::0::fees::-6239716112490883981
2213:org.powertac.common.msg.BrokerAccept::null::new::1
2214:org.powertac.common.msg.BrokerAccept::null::new::1::null
2216:org.powertac.common.RandomSeed::5::init::org.powertac.du.DefaultBrokerService::0::pricing::8741252857248937781
2226:org.powertac.common.TariffSpecification::6::new::1::CONSUMPTION
2231:org.powertac.common.Rate::7::new
2231:org.powertac.common.Rate::7::withValue::-0.5
2232:org.powertac.common.Rate::7::setTariffId::6
日志文件的模式是:
<id>:<class_name>::<order_of_execution>::<method_or_new>::<arguments>
因此,我想把下面这行翻译成XML
:
2231:org.powertac.common.Rate::7::new
将写为:
<org.powertac.common.Rate>
<rate>0</rate>
</org.powertac.common.Rate>
我有解析器给我值,这样我就可以访问数据。到目前为止,我的想法是使用Reflection{Reflection
API查找符号:
private static void printMembers(Member[] mbrs, String s) {
out.format("%s:%n", s);
for (Member mbr : mbrs) {
if (mbr instanceof Field)
out.format(" %s%n", ((Field)mbr).toGenericString());
else if (mbr instanceof Constructor)
out.format(" %s%n", ((Constructor)mbr).toGenericString());
else if (mbr instanceof Method)
out.format(" %s%n", ((Method)mbr).toGenericString());
}
if (mbrs.length == 0)
out.format(" -- No %s --%n", s);
out.format("%n");
}
我试图实现的一个例子是:
2231:org.powertac.common.Rate::7::withValue::-0.5
然后我将使用class
名称org.powertac.common.Rate
,使用Class
:
Class<?> c = Class.forName(args[0]);
printMembers(c.getMethods(), "Methods");
返回方法withValue
及其参数,以便通过编程创建以下XML
代码:
<org.powertac.common.Rate>
<withValue>-0.5</withValue>
</org.powertac.common.Rate>
此外,如果method
或class
以object
为例,那么可能会出现一种并发症,因此应该有某种递归方法来产生正确的结果。
我对Reflection
API完全是新手,所以我想知道是否有人比我更了解如何实现这一点。
谢谢
*更新 我确实可以访问这些类,并且可以实例化它们,但是,我需要找到正确的参数,所以这是一项更复杂的任务
共 (0) 个答案