基础加强-IntroSpector(内省)

来源:互联网 发布:微课视频剪辑软件 编辑:程序博客网 时间:2024/06/18 09:39

---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------

                              IntroSpector(内省)
一,内省是操作javaBean 的一种方式。jdk中提供了以javaBean进行操作的一此API,这套API就称为内省


二,,javaBean
是一种特殊的java类。当一类中的一些get或set打头的方法,那么这个类就可以当做javaBean  来操作。
如果将一个类当做javaBean操作,那么这个javaBean的属性是根据get和set方法的名称来推断出来 的,不是根据成员变量推断的。
如:
class Persion{

pirvate int x;

public int  getAge(){

retrun x;
}
public void setAge(int age){

this.x = age;
}
}                
当这个persion类当做一个普通的java类操作时,这个persion类中的一个x属性,而当做javaBean来操作时,javaBean就有一个叫做
age的属性。javaBean属性的格式:当set或get 方法后的名字如果有第二个字母而这个字母是小的,则把第一个字母变成小的,如果第二个字母大写,那么就全大写
如:getAeg 中的Age在javaBean中为age   。如果只有一个字母,在javaBean中则是小写
三,如果要在两个模块之间传递多个信息,可以将这些信息封装到一个javaBean中,这种javaBean的实例对象通常称之为值对象,(value-Object)简称
vo 。总之,一个类被当做javaBena使用时,javaBean的属性是根据方法名推断出来 的,它根本看不到java类内部的成员变量

四,内省中的类

1,PropertyDescriptor类
构造函数:
PropertyDescriptor(String propertyName,Class className):获取一个描述属性的类.其中propertyName:为javaBean中的属性
(此javaBean属性在进行推断),className:为这个属性所属于的类的class对象

方法:
Method getReadMethod():会返回此属性的get方法的对象
Method getWriteMethod();会返回此属性的set方法的对象
String getName():返回此属性的名字
二,IntroSpector类
1,静态方法:
static BeanInfo getBeanInfo(Class beanClass):返回一个关于此类的BeanInfo对象(也就是说把这个类当作javaBean来看,得到的是BeanInfo对象封装了把这个类当作javaBean看的结果)

三,BeanInfo类
这类其实就是:把一个普通类当作javaBean看的结果,把这结果封装成的对象

1,方法:
PropertyDescriptor[]getPropertyDescriptors():获得这个对象的所有属性的对象也就是PropertyDescriptor对象,将并其封装成数组

遍历PropertyDescriptor数组,通过 PropertyDescriptor中的getName方法与要找的属性进行判断,如果找到进行相应的处理并结束循环


五;通过内省获取属性的方法:
方法一:
1,将一个javaBean类和要获取的属性名封装成一个PropertyDescriptor对象。
2.通过PropertyDescriptor中的getReadMethod和getWriterMethod方法来获取关于javaBean类中的get和set的Method对象
3,通过Method类中的invoke方法来运行javaBean中的get和set 方法

代码:
//建立一个vo类描述属性值的对象
PropertyDescriptor propertyDescriptor = new PropertyDescriptor(property,persion.getClass());
//获取 此对象的的get方法
Method getAgeMethod  = propertyDescriptor.getReadMethod();
//调用 invoke方法
Object retVal = getAgeMethod.invoke(persion);
return retVal;
方法二:
1,通过IntroSpector类中的静态方法getBeanInfo(Class beanClass)方法来获取一个把一个普通类看成javaBean的结果对象BeanInfo
2,通过BeanInfo对象中的getPropertyDescriptors()方法来获取此类中的所有属性对象(PropertyDescriptor数组)
3,循环遍历此数据并通过PropertyDescriptor中的getName方法与要查找的属性名进行比较,如果找到进行比较,并结束循环。
代码:
public static void getBeanGetMethod()throws Exception {
Persion persion = new Persion(23,"dkfj");
//通过 IntroSpector中的静态方法getBeanInfo来获取把Persion看作javaBean结果的对象
BeanInfo beanInfo = Introspector.getBeanInfo(persion.getClass());
//通过 BeanInfo类中的getPropertyDescriptors方法获取存储PropertyDescriptor对象的数组
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
//通过遍历找到属性名与name有关的对象,并进行操作
for (PropertyDescriptor propertyDescriptor: propertyDescriptors) {

if(propertyDescriptor.getName().equals("name")){
//获取关于age的set方法的对象
Method setMethod = propertyDescriptor.getWriteMethod();
//调用Method类中的invoke方法调用set方法进行值的设置
setMethod.invoke(persion, "lixiaoming");
}
//验证结果是否正确 
System.out.println(persion.getName());
}
}

---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
0 0
原创粉丝点击