内省(Introspector)是Java语言对JavaBean 类属性、事件的一种缺省处理方法。
  例如类A中有属性name, 那我们可以通过getName,setName 来得到其值或者设置新的值。通过getName/setName 来访问name属性,这就是默认的规则。
  Java中提供了一套API 用来访问某个属性的getter/setter方法,通过这些API 可以使你不需要了解这个规则,这些API存放于包java.beans 中。
  一般的做法是通过类Introspector的getBeanInfo方法获取某个对象的BeanInfo 信息,然后通过BeanInfo来获取属性的描述器(PropertyDescriptor),通过这个属性描述器就可以获取某个属性对应的getter/setter方法,然后我们就可以通过反射机制来调用这些方法。
  我们又通常把JavaBean的实例对象称之为值对象(Value Object),因为这些bean中通常只有一些信息字段和存储方法,没有功能性方法。JavaBean实际是一种规范,当一个类满足这个规范,这个类就能被其它特定的类调用。一个类被当作JavaBean使用时,JavaBean的属性是根据方法名推断出来的,它根本看不到Java类内部的成员变量。去掉set前缀,然后取剩余部分,如果剩余部分的第二个字母是小写的,则把剩余部分的首字母改成小的。

package com.wgy.introspector;

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;

import org.junit.Test;

// 使用内省api操作bean的属性
public class IntrospectorTest {

 /*
  * 得到bean的所有属性
  */

    @Test 
    public void test1() throws Exception {
        BeanInfo info = Introspector.getBeanInfo(Person.class);
       // BeanInfo info =  Introspector.getBeanInfo(Person.class, Object.class); 得到除
去从object继承的属性
       PropertyDescriptor[] pds = info.getPropertyDescriptors();
       for (PropertyDescriptor pd : pds) {
           System.out.println(pd.getName());
       }
   }
 
 /*
  * 得到bean的指定属性:age
  */
 @Test
 public void test2() throws Exception {
     PropertyDescriptor pd = new PropertyDescriptor("age", Person.class);
     Person person = new Person();
     Method method = pd.getWriteMethod(); // 得到属性的写方法,为属性赋值
     method.invoke(person, 30);
     method = pd.getReadMethod(); // 获取属性的值
     System.out.println(method.invoke(person, null));
  }
 
 /*
  * 获取当前操作的属性的类型
  */
 @Test
 public void test3() throws Exception {
     PropertyDescriptor pd = new PropertyDescriptor("age", Person.class);
     System.out.println(pd.getPropertyType());
  }
}

// Person.java

package com.wgy.introspector;

public class Person {

    private String name;
    private int age;

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

}