2

私がそこにいたらPHP、次のようにオブジェクトを作成できることを知っています。

// class Name
$var = "Name";
$my_name = new $var("John", "Doe");

今、私はで同様のアプローチを採用したかったJava。ファイルから読み取った行に応じて、オブジェクトを解析および生成する必要があるファイルがあります。例えば:

2235:org.powertac.common.TariffSpecification::8::addRate::9
2235:org.powertac.common.Tariff::8::new::8
2235:org.powertac.common.TariffSpecification::10::new::1::PRODUCTION
2236:org.powertac.common.Rate::11::new
2236:org.powertac.common.Rate::11::withValue::0.015
2236:org.powertac.common.Rate::11::setTariffId::10
2236:org.powertac.common.TariffSpecification::10::addRate::11
2236:org.powertac.common.Tariff::10::new::10
2247:org.powertac.common.RandomSeed::12::init::DistributionUtilityService::0::model::-7651755067434358
2257:org.powertac.genco.Genco::13::new::nsp1a::true::true
2258:org.powertac.genco.Genco::13::new::nsp1a
2258:org.powertac.genco.Genco::15::new::nsp1b::true::true

次に、デフォルト値を使用して、タイプRate( )のオブジェクトを作成する必要があります。newしたがって、その行を解析する と、次のようになります。 "org.powertac.common.Rate"( )そしてオブジェクトStringを作成したかったのです。org.powertac.common.Rateどうすればいいですか?私はそれが怠惰な評価であることを知っています...どうすれば似たようなものを作成できますJavaか?

4

2 に答える 2

3

JavaReflectionAPIを使用します

String className = "org.powertac.common.Rate";
String ctorArg = "8";
Class<Rate> clazz = (Class<Rate>) Class.forName(className);
Constructor<Rate> ctor = clazz.getConstructor(String.class);
Rate rate = ctor.newInstance(ctorArg);

次に、Reflectionを使用してメソッドを呼び出す場合:

String methodName = "setTariffId";
String methodArg = "1";
Method setTariffId = clazz.getMethod(methodName, String.class);
setTariffId.invoke(rate, methodArg);
于 2012-08-27T19:15:23.903 に答える
1

Javaで既存のシリアル化/逆シリアル化ソリューションを使用する方が簡単かもしれませんが、文字列ベースのアプローチで機能するものは次のとおりです。

Class<?> rateClass = class.getClassLoader().loadClass("org.powertac.common.Rate");
Constructor<?> constructor = rateClass.getConstructor(String.class);

Rate rate = (Rate)constructor.newInstance("Value")

したがって、この場合:

2258:org.powertac.genco.Genco::15::new::nsp1b::true::true

次のようにします。

String className = "org.powertac.genco.Genco";
Object[] args = {"nsp1b", true, true};

Class<?> rateClass = getClass().getClassLoader().loadClass(className);
Constructor<?> constructor = rateClass.getConstructor(String.class, boolean.class, boolean.class);

Object deseraliazed = constructor.newInstance(args);

型をコンストラクター値と一緒に保存することをお勧めします。

于 2012-08-27T19:16:54.263 に答える