[英]Creating objects from a string
I know if I were in PHP
I would be able to create an object as following: 我知道如果我使用
PHP
我将能够创建一个对象,如下所示:
// class Name
$var = "Name";
$my_name = new $var("John", "Doe");
Now, I wanted to adopt similar approach in Java
. 现在,我想在
Java
采用类似的方法。 I have a file which I need to parse and produce objects depending on the line read from the file. 我有一个文件,我需要根据从文件中读取的行来解析和产生对象。 For example:
例如:
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
then I should create an object of the type Rate
, ( new
), with default values. 那么我应该使用默认值创建一个类型为
Rate
( new
)的对象。 Therefore, parsing that line would yield me: "org.powertac.common.Rate"
( String
) and I wanted to create a org.powertac.common.Rate
object. 因此,解析该行将得到:
"org.powertac.common.Rate"
( String
),并且我想创建一个org.powertac.common.Rate
对象。 How could I do it? 我该怎么办? I know it's a lazy evaluation ... how can I create something similar in
Java
? 我知道这是一个懒惰的评估...如何在
Java
创建类似的东西?
Use the Java Reflection API: 使用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);
Then, if you want to invoke a method using Reflection: 然后,如果要使用反射调用方法 :
String methodName = "setTariffId";
String methodArg = "1";
Method setTariffId = clazz.getMethod(methodName, String.class);
setTariffId.invoke(rate, methodArg);
It may be easier to use some preexisting serialization / deserialization solution in Java, but here's something that would work for your String based approach: 在Java中使用一些预先存在的序列化/反序列化解决方案可能会更容易,但是以下方法适用于基于String的方法:
Class<?> rateClass = class.getClassLoader().loadClass("org.powertac.common.Rate");
Constructor<?> constructor = rateClass.getConstructor(String.class);
Rate rate = (Rate)constructor.newInstance("Value")
So in this case: 因此,在这种情况下:
2258:org.powertac.genco.Genco::15::new::nsp1b::true::true
you would do the following: 您将执行以下操作:
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);
You may want to store the type along with the constructor values. 您可能希望将类型与构造函数值一起存储。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.