内省(Introspector) 是Java 语言对 JavaBean 类属性、事件的一种缺省处理方法。说简单一点就是操作JavaBean的一套API。

什么是JavaBean?
javaBean只是一种规范,大家都按照约定好的一套规则写java类,既然是规范就有一定的要求:

  • 类是public的,然后有个无参的构造函数
  • 属性是private的,通过设置setXXX()和getXXX()来访问
  • 能支持事件,例如 addXXXXListener(XXXEvent e), 事件可以是 Click 事件,Keyboard 事件等等
  • 提供应该 反射机制,这样可以查看java bean的各种信息
  • 可以序列化,可以保存在硬盘上
    例如:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    public class User {
    private String name;

    private String address;

    public String getName() {
    return name;
    }

    public void setName(String name) {
    this.name = name;
    }

    public String getAddress() {
    return address;
    }

    public void setAddress(String address) {
    this.address = address;
    }
    }

JDK内省类库

PropertyDescriptor类:

PropertyDescriptor可以获取某一个具体的属性。主要的方法有:

  • getPropertyType(),获得属性的Class对象;
  • getReadMethod(),获得用于读取属性值的方法,例如getXXX()方法;
  • getWriteMethod(),获得用于写入属性值的方法,例如setXXX()方法;
  • hashCode(),获取对象的哈希值;
  • setReadMethod(Method readMethod),设置用于读取属性值的方法;
  • setWriteMethod(Method writeMethod),设置用于写入属性值的方法。
    示例代码:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public class JavaBeanUtils {
    public static void main(String[] args) throws IntrospectionException {
    User user = new User();

    PropertyDescriptor propertyDescriptor = new PropertyDescriptor("name",user.getClass());
    System.out.println(propertyDescriptor.getPropertyType());
    Method method = propertyDescriptor.getReadMethod();
    System.out.println(method.getName());
    method = propertyDescriptor.getWriteMethod();
    System.out.println(method.getName());

    }
    }

    输入结果:
    1
    2
    3
    class java.lang.String
    getName
    setName

    Introspector类:

    Introspector可以按照JavaBean的规范将一个类封装成BeanInfo对象。通过调用getPropertyDescriptors()方法会返回一个包含所有属性的PropertyDescriptor对象数组,通过PropertyDescriptor可以操作类的属性。
    具体代码如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
      public class JavaBeanUtils {
    public static void main(String[] args) throws IntrospectionException {
    BeanInfo beanInfo = Introspector.getBeanInfo(User.class);
    PropertyDescriptor[] pd = beanInfo.getPropertyDescriptors();

    //迭代每一个描述器
    for (PropertyDescriptor propertyDescriptor : pd) {

    System.out.println("属性名 :"+propertyDescriptor.getName());
    System.out.println("setter :"+propertyDescriptor.getWriteMethod());
    System.out.println("getter :"+propertyDescriptor.getReadMethod());
    }
    }
    }