反射——内省机制:javaBean
Bean:组件
javaBean:java组件
条件:
类必须是具体的和公有的
并且具有无参数的构造器
给定的所有属性必须私有,提供get和set方法,设置get与set方式时,属性名第一个字母要大写,然后加上get与set
我们可以通过内省机制操作javaBean属性
IntroSpector:内省
定义:
1.内省是java对Bean类属性、事件的一种缺省的处理机制。
2.通过反射的方式操作javaBean属性。
例如:Student类中有name属性,可以通过反射调用Student中的get与set方法。
补充:java的API中提供访问bean的get与set方法接口,存在java.bean包
内省机制的实现:
1.IntroSpector的静态方法getBeanInfo,获取BeanInfo对象信息。
2.通过BeanInfo对象调用getPropertyDescriptors获取PropertyDescriptor,就可以获取bean的所有属性描述了。
3.调用getWriteMethod与getReadMethod获取当前属性的get与set机制函数。
关联配置文件(properties文件):
1.properties文件
2.java.util.Properties类
3.类名.class.getResourceAsStream("文件路径");
配置文件的相关函数:
1.load函数:加载properties文件
2.getProperty函数:获取properties文件字段属性
代码实现内省机制:
工厂模式加入内省机制(再次解耦):
创建一个配置文件(Properties)的对象,然后关联程序
private static Properties properties = new Properties();//定义一个Properties对象(配置文件对象)
static{//静态块加载配置属性
try{
//创建流关联配置文件(工厂对象获取流输入)
InputStream ins = Factory.class.getResourceAsStream("People.properties");
//加载进入对象
properties.load(ins);
}catch(Exception e){
e.printStackTrace();
}
}
新增代码有注释:
public static People getPeople(String type){
try {
//配置文件是以键值对的方式存取数据
String value = properties.getProperty(type);
People obj = (People) Class.forName(value).newInstance();
BeanInfo beanInfo = Introspector.getBeanInfo(Class.forName(value));//获取javaBean对象用于自省方式赋值
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();//获取对象所有属性描述
if("tea".equals(type)){
for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {//遍历属性描述
if("name".equals(propertyDescriptor.getName())){
Method method = propertyDescriptor.getWriteMethod();//获取属性的set方法
method.invoke(obj, properties.getProperty("name1"));//执行set方法
}else if("age".equals(propertyDescriptor.getName())){
Method method = propertyDescriptor.getWriteMethod();
method.invoke(obj, Integer.parseInt(properties.getProperty("age1")));
}
}
}else if("stu".equals(type)){
for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
if("name".equals(propertyDescriptor.getName())){
Method method = propertyDescriptor.getWriteMethod();
method.invoke(obj, properties.getProperty("name2"));
}else if("age".equals(propertyDescriptor.getName())){
Method method = propertyDescriptor.getWriteMethod();
method.invoke(obj, Integer.parseInt(properties.getProperty("age2")));
}
}
}
return obj;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}