1.在熟悉内省机制之前先让我们了解下什么是javabean以及它特有的规范:
百度百科给的解释如下:
我们可以得出如下3点信息:
1):类必须使用public修饰.
2):必须保证有公共无参数构造器.
3):包含了属性的操作手段(给属性赋值,获取属性值).
注意一点: 若:数据类型是boolean,则不叫get方法,而是is方法.
现在我们已经知道了什么是javabean了。一般我们在写实体类的时候都会加上getter和setter方法
2.让我们看看什么是内省,通过查看jdk我们得到如下:
作用:用于查看和操作 javabean 中的属性
1):查看属性:获取 JavaBean 中的每一个属性名/属性类型
标准情况下字段和属性名相同,那就是字段的类型就是属性的类型
2):操作属性:通过 getter 方法获取属性值,通过 setter 方法给属性设置值
学习一个新的知识点,我们需要去掌握一个核心的类 (Class)
内省的核心类: Introspector
我们通过查看jdk去使用Introspector类中的方法:
通过getBeanInfo方法可以得到一个BeanInfo对象。我们再次查看jdk得到有关BeanInfo的信息如下:
通过查看它的方法得到:
可以得到一个PropertyDescriptor类型的数组里面存储的是属性的信息,既然是数组那么我们可以对其进行遍历操作。让我们在通过jdk查看PropertyDescriptor类,如下:
通过这两个方法可以获取属性值就相当于实体类中的getter和setter方法
现在给一个需求:定义一个User实体类,其中有两个属性name,age,通过内省机制的方法去得到属性以及对属性赋值
代码结构如下:
其中的User类:
package com.mywork._02.intro;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@ToString
public class User {
private String name;
private int age;
public User() {
}
public User(String name, int age) {
super();
this.name = name;
this.age = age;
}
}
其中的IntrospectorUser类如下:
package com.mywork._02.intro;
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
public class IntrospectorUser {
public static void main(String[] args) throws Exception {
//利用反射通过字节码创建对象
User obj = User.class.newInstance();
//获取javabean的描述对象
BeanInfo beanInfo = Introspector.getBeanInfo(User.class, Object.class);
//获取所有的属性描述器
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
//对所有的属性进行遍历操作
for (PropertyDescriptor pd : pds) {
//获取属性名
String strname = pd.getName();
System.out.println("name:"+strname);
//获取getter和setter方法
Method get = pd.getReadMethod();
Method set = pd.getWriteMethod();
//对属性进行赋值操作
if("name".equals(strname)){
set.invoke(obj, "张凌飞");
}
if("age".equals(strname)){
set.invoke(obj, 23);
}
}
System.out.println(obj);
}
}
得到的结果:
和预期的一样,完成需求。这就是内省机制,可能在这里看不出它的作用。在jdbc中最后封装的时候遍历结果集的时候,就显示出内省的强大了。