私は、そのクラスのオブジェクトを作成せずに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>
また、method
orを例にclass
とると、複雑になる可能性があるobject
ため、正しい結果を生成するには何らかの再帰的アプローチが必要です。私はReflection
API にまったく慣れていないので、誰かがそれを達成する方法を私よりもよく知っているかどうか疑問に思っていました。ありがとう
*更新 クラスへのアクセス権があり、それらをインスタンス化できますが、正しい引数を見つける必要があるため、これはより複雑なタスクです。