简介
- 基于反射 , java所提供的一套应用到JavaBean的API
什么是Bean类
* 定义一个Bean类: * 至少含有: * 拥有无参构造器 * 所有属性私有, * 所有属性提供get/set方法 * 实现了序列化接口 * 这种类, 我们称其为 bean类 .
- 使用内省机制获取set/get方法比使用反射方便,操作Bean对象比较方便,
- Java提供了一套java.beans包的api , 对于反射的操作, 进行了封装 !
内省机制的使用
Introspector:
- 获取Bean类信息
方法:
- BeanInfo getBeanInfo(Class cls) 通过传入的类信息, 得到这个Bean类的封装对象 .
BeanInfo常用的方法:
- MethodDescriptor[] getPropertyDescriptors(): 获取bean类的 get/set方法 数组
MethodDescriptor常用方法:
- 1. Method getReadMethod(); 获取一个get方法
- 2. Method getWriteMethod(); 获取一个set方法
- 有可能返回null 注意 ,加判断 !
package demo;
import java.io.Serializable;
public class Express implements Serializable {
private String name;
private String phoneNumber;
private String address;
private boolean flag;
public Express() {
}
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getPhoneNumber() { return phoneNumber; }
public void setPhoneNumber(String phoneNumber) { this.phoneNumber = phoneNumber;}
public String getAddress() { return address; }
public void setAddress(String address) { this.address = address; }
@Override
public String toString() {
return "Express{" +
"name='" + name + '\'' +
", phoneNumber='" + phoneNumber + '\'' +
", address='" + address + '\'' +
'}';
}
}
package demo;
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
public class Main {
public static void main(String[] args) throws IntrospectionException {
//获取字节码文件对象(获取类信息)
Class<Express> c = Express.class;
//使用内省,通过传入的类信息, 得到这个Bean类的封装对象BeanInfo
BeanInfo beanInfo = Introspector.getBeanInfo(c);
//获取bean类的 get/set方法 数组
PropertyDescriptor[] pds= beanInfo.getPropertyDescriptors();
for (PropertyDescriptor pd:pds) {
//获取get方法
Method get = pd.getReadMethod();
//获取set方法
Method set = pd.getWriteMethod();
System.out.println(get);
System.out.println(set);
//获取set,get方法对应的属性及类型,比如getName()对应的属性是name,类型String
System.out.println(pd.getName());//属性名称
System.out.println(pd.getPropertyType());//属性类型
}
}
}
注意:
若bean类中属性是boolean类型,比如private boolean flag,通过内省获取的set/get方法是setFlag和isFlag,将getFlag替换成了isFlag