如何通过方法名调用getter方法?

19

我有以下的bean类:

public class A{
        private String field;

        public String getField() {
            return field;
        }

        private String setField(String field) {
            this.field = field;
        }

    }

并且下面的类:

    public class B{

         public static void main(String[] args){
             A a = new A();
             //do stuff
             String f = //get a's field value
         }
    }

如何获取A类的特定对象Getter方法返回的值?当然,我可以使用Method.invoke(Object obj,Object ... args)方法调用该方法,但我不想手动编写"get"前缀。有没有可能避免这种情况?


2
你可能想要查看 java.beans.Introspector - Jon Skeet
@JonSkeet 看起来就是我要找的。您能否提供一个完整的答案? - user3663882
1
@user3663882 请查看此教程 - Neeraj Jain
2个回答

58
试试使用 java.beans.PropertyDescriptor(假设您的属性有正确的 settergetter,所以在您的情况下,需要更正您的 private String setField(String field) setter,因为:(a) 它的返回类型应该是 void 而不是 String,(b) 它应该是 public 而不是 private)。
Object f = new PropertyDescriptor("field", A.class).getReadMethod().invoke(a);

或者稍微长一点的版本(与之前的版本完全相同)

PropertyDescriptor pd = new PropertyDescriptor("field", A.class);
Method getter = pd.getReadMethod();
Object f = getter.invoke(a);

PropertyDescriptor 允许我们做很多事情,例如它的 getReadMethod()

获取应该用于读取属性值的方法。

因此,我们可以获得代表 field 的 getter 的 java.reflect.Method 实例。现在我们所需要做的就是在我们想要获取结果的 bean 上简单地调用它。


好的,谢谢。你能否用一些规范参考来增强你的答案呢? - user3663882
阅读 PropertyDescriptor 文档:PropertyDescriptor(String propertyName, Class<?> beanClass)。该构造函数用于创建符合标准 Java 约定的属性,即具有 getFoo 和 setFoo 存取方法。 - Jean-Baptiste Yunès
1
@Jean-BaptisteYunès 如果我们只有getField()方法而没有对应的字段和setter,那么getter会被调用吗? - user3663882
非常棒的例子。我到处寻找最简单的解决方案,这最终帮了我。 - AnirbanDebnath
1
这是一个不错的解决方案,但是就像@user3663882所怀疑的那样,如果getter/setter之一不存在,则构造函数会抛出IntrospectionException。更好的解决方案是使用Introspector.getBeanInfo(...).getPropertyDescriptors(),如此处所建议的 - 即使只有其中一个存在,它也可以正常工作。 - ManSamVampire
显示剩余2条评论

8
另一个简单的方法是使用基本的Java反射技术。
Method fieldGetter = A.getClass().getMethod("getField");
String f = fieldGetter.invoke(A).toString();

就这么简单。 干杯!!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接