使用java反射时,我们可以设置私有字段而不必告诉参数类型。
例如,如果这是我的Child
类,
package reflection;
public class Child {
private String name;
private Integer value;
private boolean flag;
public String getLName()
{
return this.name;
}
public void setName(String name)
{
this.name = name;
}
public Integer getValue()
{
return this.value;
}
public void setValue(Integer value)
{
this.value = value;
}
public boolean getFlag()
{
return this.flag;
}
public void setFlag(boolean flag)
{
this.flag = flag;
}
public String toString()
{
return "Name" + this.name;
}
}
我想在Child
课程中设置此Tester
课程的字段。
package reflection;
public class Tester {
public static void main(String args[]) throws Exception
{
Class<?> clazz = Class.forName("reflection.Child");
Object cc = clazz.newInstance();
cc.getClass().getMethod("setName", String.class).invoke(cc,"AAA");
}
}
我在这里设置Name
字段的值。
在该行中,
cc.getClass().getMethod("setName", String.class).invoke(cc,"AAA");
我使用过String.class
。有没有办法做到这一点,而不必告诉字段类型。 Java能否以某种方式自动识别类型?
这是因为我将从csv
文件中获取名称,值和标志数据,并且我想使用循环将所有三个字段设置在一行中。
我将使用值声明一个String数组 - “setName”,“setValue”和“setFlag”,然后我想使用以下内容
cc.getClass().getMethod(array[index]).invoke(cc,data);
我知道上面的陈述是错误的,但是有没有替代方案呢?
答案 0 :(得分:1)
获取所有方法并找到匹配的方法,其中包含有关参数的类型信息:
String name;
String value;
Method[] methods = Child.class.getMethods();
for (Method method : methods) {
if (!method.getName().equals(name))
continue;
Class<?> paramType = method.getParameterTypes()[0];
//You will have to figure how to convert the String value to the parameter.
method.invoke(child, paramType.cast(value)); // for example
}
答案 1 :(得分:0)
您可以使用Apache Commons FieldUtils.writeDeclaredField
Child childObject = new Child();
FieldUtils.writeDeclaredField(childObject, "name", "John", true);