java - 使用反射将值设置到对象中

标签 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
    }
}

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

a test = new a();
a.setAttr1(new typeA());

但是我如何使用反射来做到这一点呢?我已经使用反射获得了 setAttr1() 方法,但我不知道如何创建一个新的 typeA 对象以插入到 setter 中。

最佳答案

使用Class#newInstance() .

Class<TypeA> cls = TypeA.class;
TypeA typeA = cls.newInstance();

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

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

您可以在 Sun tutorial on the subject 中了解有关反射的更多信息.也就是说,类名 ought以大写开头。我已在上面的示例中更正了它。

顺便说一句,您可能会找到提到的工具之一,而不是重新发明 Javabean 反射轮 here也很有用。

关于java - 使用反射将值设置到对象中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2732659/

相关文章:

java - 使用 Ant 将 Maven 应用程序复制到 Raspberry Pi 时出现 AccessDeniedException

scala - 如何从 M7 中的类型获取 typeArgs?

java - Spring 与 Java 反射

c# - 在 C# 反射中获取 "Type"的类型

swift - 如何在 Swift 中覆盖 setter

java - Setter 和 getter 不工作

java - Jersey 的 EventSource 会阻塞,直到第一个数据 block 被 receiveid

java - 进度条对齐

java - 如何更改对象 ArrayList 中字段的值?

c# - 私有(private) setter 不会阻止更改数组元素