如何使用反射定义动态设定器和获取器?

2022-09-04 19:44:38

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

Foo f = new Foo();

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

f.setparam1("value");

对于getter来说也是如此。我知道反思会有所帮助,但我无法做到。请帮忙。谢谢!


答案 1

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

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(methodName, 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();
}

答案 2

Apache Commons BeanUtils做到了这一点。