为什么PropertyDescriptor(String,Class)构造函数使用isFieldName()作为getter名称?

时间:2015-09-11 19:10:46

标签: java reflection

我希望构造函数测试getFieldName()和isFieldName()getter。为什么IS_PREFIX是默认前缀?

源代码:http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/beans/PropertyDescriptor.java#PropertyDescriptor.%3Cinit%3E%28java.lang.String%2Cjava.lang.Class%29

我使用Java 1.8.0_31_b13。

我如何使用它:

import java.util.*;
import java.lang.*;
import java.io.*;
import java.beans.PropertyDescriptor;

/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
    class Foo { String bar; public String getBar(){return bar;} public void setBar(String b){this.bar=b;} }

    public static void main (String[] args) throws java.lang.Exception
    {
        java.beans.PropertyDescriptor p = new java.beans.PropertyDescriptor("bar", Foo.class);
        System.out.println(p.getReadMethod().getName()); // prints getBar, not consistent with source code
    }
}

https://ideone.com/5pm0lA

代码打印getBar,但我不明白为什么。

1 个答案:

答案 0 :(得分:4)

  

代码打印getBar,但我不知道为什么。

javadoc陈述

  

为后面的属性构造object   具有PropertyDescriptorgetFoo访问器方法的标准Java约定。   因此,如果参数名称是" fred",它将假定作者   方法为setFoo,读者方法为setFred(或getFred   对于isFred属性。)

您已提供boolean propertyName,您的班级有一个名为bar的无障碍访问者,这是他们返回的内容。

  

我希望构造函数测试getFieldName()和   isFieldName()getters。为什么IS_PREFIX是默认前缀?

您可以访问我们去的兔子洞的源代码。具体来说,请查看getReadMethod方法的逻辑。如果找到具有getBar前缀的getter,则在该方法中覆盖构造函数中设置的前缀。

提前更改问题:

您的访问者和变异者不是getPropertyDescriptor首先尝试使用public / public前缀(遵循约定)查找get getter / setter,然后使用set尝试is }属性。错误消息只是告诉你它尝试过的最后一件事。

制作您的媒体资源boolean