------- android培训、java培训、期待与您交流! ----------
内省:
主要作用就是对JavaBean进行操作。
JavaBean:
特殊的Java类,对属性进行过封装,把属性私有化,每个属性都有public修饰的get ,set方法。
JavaBean是Java类,而Java类不一定都是JavaBean。
JavaBean主要用于传递数据信息,比如在两个模块之间传递多个信息,就可以把这些信息封装到一个JavaBean中,这种JavaBean的实例对象被称之为值对象(Value Object,简称VO)。
内省操作:
简单操作:
创建一个PropertyDescriptor的实例对象,给构造方法中传入属性名,该属性名所在的类的字节码文件。然后根据创建的PropertyDescriptor实例对象的getReadMethod()、getWriteMethod(),获取该属性的get方法和set方法。接下来就是反射的操作了,用获得的get、set方法的invoke方法作用与某个对象。
复杂操作:
通过Introspector.getBeanInfo(),传入要操作的类的字节码文件,返回一个BeanInfo对象,通过BeanInfo对象的getPropertyDescriptors方法获得要操作的类的所有属性,然后进行循环比较,获得要找的属性的get、set方法。
1 package test.enhance.introspector; 2 3 import java.beans.BeanInfo; 4 import java.beans.MethodDescriptor; 5 import java.beans.PropertyDescriptor; 6 import java.lang.reflect.Method; 7 8 import cn.itcst.day1.ReflectPoint; 9 10 public class Introspector { 11 12 /** 13 * @param args 14 */ 15 public static void main(String[] args) throws Exception { 16 // TODO Auto-generated method stub 17 18 //--------------------内省简单操作 19 String name = "x"; 20 //用内省的方式获得该类的属性x 21 PropertyDescriptor pd = new PropertyDescriptor(name,ReflectPoint.class); 22 23 //根据属性获得该属性的get方法 24 Method methodGetX = pd.getReadMethod(); 25 26 ReflectPoint rp = new ReflectPoint(1,2); 27 28 //用该属性的get方法作用于对象 29 System.out.println(methodGetX.invoke(rp)); 30 31 32 //获取set方法 33 Method methodSetX = pd.getWriteMethod(); 34 methodSetX.invoke(rp, 100); 35 36 System.out.println(rp.getX()); 37 38 //------------------内省复杂操作 39 //根据Introspector.getBeanInfo()获得一个BeanInfo 40 BeanInfo beanInfo = java.beans.Introspector.getBeanInfo(ReflectPoint.class); 41 //获得该类中所有的方法 42 PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors(); 43 44 for(PropertyDescriptor prod : pds){ 45 //如果该属性名字与传入的名字相同 46 if(prod.getName().equals(name)){ 47 Method mdGetX = prod.getReadMethod(); 48 System.out.println(mdGetX.invoke(rp)); 49 break; 50 } 51 } 52 //获得类的所有方法,构造函数不在内。 53 MethodDescriptor[] mds = beanInfo.getMethodDescriptors(); 54 for(MethodDescriptor md : mds){ 55 System.out.println(md.getName()); 56 } 57 } 58 59 60 61 }
由于对JavaBean的操作比较频繁,而用内省的方式呢又比较麻烦,所有开源勇士们就弄了一个工具包出来专门操作JavaBean,
首先要使用必须导入两个jar包,commons-beanutils.jar和commons-logging-1.1.1.jar
BeanUtils类:
设置属性:BeanUtils.setProperty(); 需要传入要操作的对象,那个属性,值
获得属性:BeanUtils.getProperty();需要传入要操作的对象,哪个属性
需要注意的是:BeanUtils类在设置值和取出值的时候都转换为了String类型,也就是说在传入和取出的时候都不能用原始类型。
PropertyUtils类:
设置属性:PropertyUtils.setProperty();
获得属性:PropertyUtils.getProperty();
PropertyUtils的用法是和BeanUtils一样的,唯一不懂的是PropertyUtils保留了传入和取出值的原有数据类型,这个一点要注意。
1 //-------------BeanUtils工具类 2 //setProperty()设置属性值 3 //BeanUtils类会把设置和取出的值都转换为String类型。 4 BeanUtils.setProperty(rp, "x", "999"); 5 6 //getProperty(); 获得rp的属性x的值 7 int x = Integer.parseInt(BeanUtils.getProperty(rp, "x")); 8 System.out.println("用BeanUtils工具获得的X : " + x); 9 10 11 //PropertyUtils类,不会把值转换为String类型。保持原有类型。 12 PropertyUtils.setProperty(rp, "x", 888); 13 //取值 14 int proX = (Integer)PropertyUtils.getProperty(rp, "x"); 15 System.out.println("用PropertyUtils工具获得的X : " + proX); 16 17 //支持级联操作 18 BeanUtils.setProperty(rp, "birthday.time", 111); 19 System.out.println(PropertyUtils.getProperty(rp, "birthday.time"));