内省(Introspector)是Java语言对Bean类属性、事件的一种缺省处理方法。本质就是反射.
一般的做法是通过类Introspector来获取某个对象的BeanInfo信息,然后通过BeanInfo来获取属性的描述器 (PropertyDescriptor),通过这个属性描述器就可以获取某个属性对应的getter/setter方法,然后我们就可以通过反射机制来 调用这些方法。
核心类:
PropertyDescriptor - 属性描述器
API:
PropertyDescriptor 描述 Java Bean 通过一对存储器方法导出的一个属性。
以下javaBean拥有get and set就是一对,就可以通过PropertyDescorptor来操作。
JavaBean的定义
拥有无参数构造。
拥有一个get | set | isXxxx方法。
如果希望被内省使用必须:1、 拥有元参数构造 2、 拥有一对get && setXxx | isXxxx方法
1 //1、反射 2 User u=new User(); 3 Method m= u.getClass().getMethod("setId", String.class); 4 m.invoke(u, "12345"); 5 System.err.println("》》反射"+u); 6 7 System.err.println("============================"); 8 9 //2、内省 10 //注意:这里默认后面两个参数可以省略,前提是get和set方法符合规则getId和setId,否则就要在后面添加两个参数,是get和set的函数名。 11 PropertyDescriptor pd=new PropertyDescriptor("id", u.getClass()); 12 /** 13 * pd.getWriteMethod()=setXxx 14 * pd.getReadMethod()=getXxx 15 */ 16 m= pd.getWriteMethod(); 17 m.invoke(u, "1234567890-"); 18 pd=new PropertyDescriptor("age", u.getClass()); 19 m=pd.getWriteMethod(); 20 m.invoke(u, 90); 21 System.err.println("内省》》"+u); 22 System.err.println("========================"); 23 //3、BeanInfo专门用于分析一个Bean拥有多少属性 24 BeanInfo bi=Introspector.getBeanInfo(u.getClass()); 25 PropertyDescriptor [] pds=bi.getPropertyDescriptors(); 26 for(PropertyDescriptor p:pds) 27 { 28 String name=p.getName(); 29 System.err.println(name); 30 } 31 System.err.println("*******************************"); 32 //4、遍历方法 33 User user=new User(); 34 Method[] ms=user.getClass().getDeclaredMethods(); 35 for(Method me:ms) 36 { 37 String name=me.getName(); 38 System.err.println(name); 39 if(name.startsWith("set")) 40 { 41 Class<?>[] c=me.getParameterTypes(); 42 System.err.println(c[0]); 43 if(c[0].equals(String.class)) 44 { 45 me.invoke(user, "Jack"); 46 } 47 else if (c[0].equals(Integer.class)) { 48 me.invoke(user, 30); 49 } 50 51 } 52 } 53 System.err.println(user); 54 }