使用反射将值设置为对象

mar*_*den 5 java reflection setter

我有一个具有很多属性的对象,每个属性都有它的getter和setter.每个属性都有一个非基本类型,我在运行时不知道.

例如,我所拥有的是:

public class a{

    private typeA attr1;
    private typeB attr2;

    public typeA getAttr1(){ return attr1; }
    public typeB getAttr2(){ return attr2; }

    public void setAttr1(typeA at){ attr1 = at; }
    public void setAttr2(typeB at){ attr2 = at; }
}

public class typeA{
    public typeA(){
        // doesn't matter
    }
}

public class typeB{
    public typeB(){
        // doesn't matter
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,使用反射,我获得了属性的setter方法.以标准方式设置值是这样的:

a test = new a();
a.setAttr1(new typeA());
Run Code Online (Sandbox Code Playgroud)

但是我怎么能用反射呢?我已经使用了反射的setAttr1()方法,但我不知道如何创建一个新的typeA对象插入到setter中.

Bal*_*usC 11

使用Class#newInstance().

Class<TypeA> cls = TypeA.class;
TypeA typeA = cls.newInstance();
Run Code Online (Sandbox Code Playgroud)

或者,在您必须确定方法参数类型的特定情况下:

Class<?> cls = setterMethod.getParameterTypes()[0];
Object value = cls.newInstance();
setterMethod.invoke(bean, value);
Run Code Online (Sandbox Code Playgroud)

您可以在Sun教程中了解有关该主题的反射的更多信息.也就是说,类名应该以大写字母开头.我已经在上面的例子中纠正了它.

顺便说一句,你可能会发现这里提到的工具之一也很有用,而不是重新发明Javabean反射轮.

  • 并且它们必须具有默认(无参数)构造函数(+1) (2认同)