gpt4 book ai didi

java - 如何使用 Reflection API 查找字段变量或方法 - Java

转载 作者:行者123 更新时间:2023-11-30 11:41:39 25 4
gpt4 key购买 nike

我正在尝试提出一种算法,该算法允许我将 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 Java API 对我来说是个肮脏的工作,否则我几乎不得不创建一个符号表来完成我想要的。我知道我可以使用 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>

此外,如果 methodclassobject 为例,那么其中一个潜在的并发症是,应该有某种递归方法来产生正确的结果。我对 Reflection API 完全陌生,所以我想知道是否有人比我更了解如何实现它。谢谢

*更新我确实可以访问这些类,并且可以实例化它们,但是,我需要找出正确的参数,因此这是一项更复杂的任务。

最佳答案

您的问题不清楚:您是否有用于存储数据的类?如果您还没有表示数据的类,并且不想创建它们,那么反射将无济于事。

相反,我建议只使用 JAXP产生你的输出。创建一个 Document,向其添加 Element 子级,然后使用序列化程序生成输出。谷歌“DOM 教程”可以找到一些示例。

关于java - 如何使用 Reflection API 查找字段变量或方法 - Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12178643/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com