问题 如何使用反射定义动态setter和getter?


我在资源包的循环中列出了一个字符串,字段名称列表。我创建一个对象然后使用循环我想为该对象设置值。例如,对于对象

Foo f = new Foo();

使用参数param1,我有字符串“param1”,我想以某种方式将“set”与“set”+“param1”连接起来,然后将其应用于f实例:

f.setparam1("value");

对于吸气剂也一样。我知道反思会有所帮助,但我无法做到。 请帮忙。谢谢!


7275
2017-12-30 07:10


起源

如果你正在为所有存在的东西制作制定者和吸气剂,那听起来你应该考虑把事情公之于众。 - EnabrenTane
即使属性是公共的,我如何使用反射使字符串表现为字段? - wasimbhalli
为什么要自己实施?你可以使用龙目岛(projectlombok.org/features)。只需添加 @Getter 对您的类进行注释,它将为每个字段生成一个getter方法(注意:它不是源代码生成工具)。 - rodion
嗨,请发给你Foo课的详细信息 - nurealam11


答案:


你可以做这样的事情。您可以使此代码更通用,以便您可以使用它来循环字段:

Class aClass = f.getClass();
Class[] paramTypes = new Class[1];
paramTypes[0] = String.class; // get the actual param type

String methodName = "set" + fieldName; // fieldName String
Method m = null;
try {
    m = aClass.getMethod("confirmMsg", paramTypes);
} catch (NoSuchMethodException nsme) {
    nsme.printStackTrace();
}

try {
    String result = (String) m.invoke(f, fieldValue); // field value
    System.out.println(result);
} catch (IllegalAccessException iae) {
    iae.printStackTrace();
} catch (InvocationTargetException ite) {
    ite.printStackTrace();
}

9
2017-12-30 07:29



confirmMsg将被methodName替换...它的工作原理,非常感谢:) - wasimbhalli
嗨,请帮帮我。我需要更多细节。 - nurealam11


Apache Commons BeanUtils 可以。


7
2017-12-30 09:04



提供有关链接资源回答问题的内容的一些信息是有帮助的。 - freakTheMighty
请参阅此链接以获取示例 例 - Uppicharla