使用Java Reflection

时间:2017-03-05 14:38:31

标签: java reflection

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

我知道上面的陈述是错误的,但是有没有替代方案呢?

2 个答案:

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