Java 内省

648 阅读2分钟

微信公众号_CoderLi.png

何为 JavaBean ?

一种特殊的类、主要用于传递数据信息、这种类中的方法主要用于访问私有的字段、且方法符合某种命名规则。

JavaBean 的特征

  1. 属性都是私有的
  2. 存在无参构造方法
  3. 私有属性的 getter/setter 方法分别为 getXxx/setXxx
  4. getter 方法必须有返回值且无入参、setter 方法必须有入参且无返回值

符合这些特征的类、称为 JavaBean。

JDK 提供了一套 API 用来访问某个属性的 getter/setter 方法、这个就是 Java 内省。

内省与反射

反射:JVM 在运行的时、对任意的一个对象、都能访问到这个类的属性和方法。

内省 Introspector:是 Java 语言对 JavaBean 属性、事件的处理方式

  1. 反射针对的是任何类、任何对象、而内省只是针对 JavaBean。内省通过反射来操作 JavaBean 的属性。
  2. 内省设置属性值肯定调用 setter 方法、而反射则不一定 (Field 对象)
  3. 反射就像是镜子、能看到对象的所有、是客观事实。内省更像是主观判断、比如看到 getClass()、内省就会认为这个类中有 class 字段、但事实上则不一定。

例子

public class Main {
    public static void main(String[] args) throws Exception{
        BeanInfo beanInfo = Introspector.getBeanInfo(People.class);
        PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
        for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
            System.out.print(propertyDescriptor.getName()+"   ");
        }
    }
    // 程序输出:age   class   name 
    // 为什么会输出class呢?前文中有提到,“看到getName(),内省就会认为这个类中有name字段,但事实上并不一定会有name”,我们知道每个对象都会有getClass方法,所以使用内省时,默认就认为它具有class这个字段
}

class People{
    String name;
		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;
  }
}

PropertyDescriptor:属性描述符,能够描述javaBean中的属性,通过属性描述符我们能知道这个属性的类型,获取到操纵属性的方法(getter/setter)