从字符串创建对象

时间:2012-08-27 19:12:01

标签: java

我知道如果我在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中创建类似的内容?

2 个答案:

答案 0 :(得分:3)

使用Java Reflection API:

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);

然后,如果你想invoke a method使用Reflection:

String methodName = "setTariffId";
String methodArg = "1";
Method setTariffId = clazz.getMethod(methodName, String.class);
setTariffId.invoke(rate, methodArg);

答案 1 :(得分:1)

在Java中使用一些预先存在的序列化/反序列化解决方案可能更容易,但这里有一些适用于基于String的方法:

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);

您可能希望将类型与构造函数值一起存储。