我有一个类类型,我有一个字符串值:
Class<?> type = Integer.class // <-- in reality, that type is
// determined at runtime
String value = "3"; // <-- same here, actually read from a file
我的目标是实例化“type”的实例并用“value”的值填充它...这样我就有了等同于
Integer i = new Integer(value);
唯一可能的方法是使用一长串 if 语句:
if (type == Integer.class) {
// do this
}
或者还有另一种聪明/正确的方法吗?可能的类类型可能完全不同,例如 Integer/Date 等...
编辑1
这里有更多的上下文:
我有一个包含许多值的文件,这些值是不同数据类型实例的文本表示:
1|3.4|2011-08-24
在我的程序中,我得到了一个类类型和该类中的一个方法,它们在编译时都是未知的。
我想在该类型的实例上调用该方法,并将文件中的值作为参数。但是为此,我确实必须具有与该值对应的对象,在示例中可以是 Integer/int、float/double、Date。 我可以通过反射获取方法形式参数的这些数据类型,但我不确定进行从字符串到对象的转换的最佳方法...
也许这个伪程序会解决问题:
String[] values = getValuesFromFile;
Class<?> type = getType();
Method method = getMethod();
Class<?>[] formalParameterTypes = getMethodParameterTypes();
Object[] objects;
for(int i; i < values.length; i++)
objects[i] = convert(values[i],formalParameterTypes[i]);
method.invoke(objects);
最佳答案
动态类加载和反射就是为了解决这些问题而发明的。例如
Class<?> type = Class.forName("MyClassName");
Object obj = type.newInstance();
现在如果你想在对象中设置字段,你有两个选择:
- 如果潜在类共享一个公共(public)基类/接口(interface),您可以将对象向下转换为该接口(interface)并通过接口(interface)方法对其进行操作,
- 如果潜在类没有继承关系但具有相同的方法/字段,您可以通过bean introspection设置字段值,或者您可以使用反射调用该方法。
关于java - 将字符串值转换为未知(在编译时)对象类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7175025/