何为 JavaBean ?
一种特殊的类、主要用于传递数据信息、这种类中的方法主要用于访问私有的字段、且方法符合某种命名规则。
JavaBean 的特征
- 属性都是私有的
- 存在无参构造方法
- 私有属性的 getter/setter 方法分别为 getXxx/setXxx
- getter 方法必须有返回值且无入参、setter 方法必须有入参且无返回值
符合这些特征的类、称为 JavaBean。
JDK 提供了一套 API 用来访问某个属性的 getter/setter 方法、这个就是 Java 内省。
内省与反射
反射:JVM 在运行的时、对任意的一个对象、都能访问到这个类的属性和方法。
内省 Introspector:是 Java 语言对 JavaBean 属性、事件的处理方式
- 反射针对的是任何类、任何对象、而内省只是针对 JavaBean。内省通过反射来操作 JavaBean 的属性。
- 内省设置属性值肯定调用 setter 方法、而反射则不一定 (Field 对象)
- 反射就像是镜子、能看到对象的所有、是客观事实。内省更像是主观判断、比如看到 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)