java - 使用java反射调用setter方法

标签 java reflection

我需要使用反射来调用一个类的setter方法,代码如下:

try {             
   Method method = myObj.getClass().getMethod("set" + fieldName, new Class[] { value.getClass() });               
   method.invoke(myObj, value);
     } catch (Exception ex) {
         ex.printStackTrace();
     }

value是一个ArrayList,setter方法如下:

public void setNames(List<String> names){
    this.names = names;
}

运行此代码时抛出java.lang.NoSuchMethodException,但是当setter方法参数类型从List更改为ArrayList它执行得很好。有没有办法在从类中获取方法时,将setter方法参数保持为父类(super class)型,并且仍然使用反射而不手动给出参数的类型?

最佳答案

如果你碰巧使用 spring 框架,你可以使用 PropertyAccessorFactory用于检索 PropertyAccessor 的实现界面:

直接访问属性

PropertyAccessor myAccessor = PropertyAccessorFactory.forDirectFieldAccess(object);
// set the property directly, bypassing the mutator (if any)
myAccessor.setPropertyValue("someProperty", "some value");

通过访问器/修改器访问属性

如果你需要使用它们的 getterssetters 来访问你的属性,你可以使用 forBeanPropertyAccess 方法来代替:

PropertyAccessor myAccessor = PropertyAccessorFactory.forBeanPropertyAccess(object);
// a `setSomeProperty()` method will be used
myAccessor.setPropertyValue("someProperty", "some value");

关于java - 使用java反射调用setter方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10009052/

相关文章:

java - 使用 Setter 和 Getter 操作变量

java.util.LinkedList<ClassName> 无法转换为 ClassName

c# - c#中构造函数参数的名称

c# - 改善绩效反射(reflect)——我应该考虑哪些替代方案?

java - 如何在 Flink 中用 Java 将 AvroFile 读入 Tuple 类

java - 需要提交多少次调用才能与 newWorkStealingPool 一起使用?

c# - 无法使用此代码和表达式 api 获取此属性名称

C# 使用反射设置 Dictionary<String, Object> 值

java - intellij tomcat "copying resources"花费太多时间

c# - 使用 IL Emit 替换 Activator.CreateInstance