有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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{}API来完成这个肮脏的工作,否则我几乎必须创建一个符号表来完成我想要的。我知道我可以使用ReflectionAPI查找符号:

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为例,那么可能会出现一种并发症,因此应该有某种递归方法来产生正确的结果。 我对ReflectionAPI完全是新手,所以我想知道是否有人比我更了解如何实现这一点。 谢谢

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


共 (0) 个答案