/**
* 内省:Introspector ,主要用于对javaBean进行操作,是JDK为操作javaBean提供的一整套API。
* 内省就是对javaBean类进行内部检查,检查出它到底有那些javaBean属性,公共方法等信息。
*
* 什么是javaBean?
* javaBean 是一个特殊的java类,是一个类中的某些方法需要符合某些规则的类。
* 这些规则就是:必须有一些以set和get打头的方法,比如:setXXX,getXXX。对于属性
* 并没有什么硬性的要求,大家约定的一般写法,就是成员变量都是私有的,get和set方法是公共的
*
* javaBean的作用:JavaBean应用非常广泛,尤其是在J2EE中,一般可以被用作软件的模块与模块之间的
* 信息传递,所以,这类javaBean对象又被成为值对象(即Value Object),值对象,顾名思义,就是以传递值为目标的对象,
* 对象中属性比较多,方法很少。主要就是为了传递这些字段。
*
* javaBean和普通的java类的关系:一个javaBean可以被当成为普通的java类来进行操作,一个java类也可以被当做javaBean来看待
* (包括那些类中没有get,set大头的方法的类,也可以被看成javaBean,只不过这个javaBean中没有任何属性)
*
* javaBean的属性:javaBean的属性不同于类的成员变量(类的属性),javaBean的属性的名称是以方法名的后缀来确定的,javaBean
* 的属性可以看成是get和set方法以及在外部看不到的私有成员变量的封装体。这个封装体有众多的信息,
* 用java.beans.PropertyDescriptor类来进行描述,其中就包括属性名这个信息。
* javaBean的属性名就是去掉开头的set,get,然后对剩余的部分,如果剩余部分的第二个字母不存在,或者存在且为小写字母
* ,就将开头的字母转成小写。否则,保持开头字母原样。javaBean的属性可以理解为在外部的人看起来,这个Bean应该有的
* 一个属性。
*
* javaBean的好处之一就是可以用内省的这套API来操作它,为开发节省了很多事情,更方便了
*
* 内省的API :Introspector类、BeanInfo类、PropertyDescriptor类,内省技术用到了反射技术
*
* BeanInfo类:用来描述将一个类看成是javaBean后,这个javaBean应该具有的信息。即这个类的对象中存储了一个java类被看成
* javaBean后所具有的所有细节信息。
*
*/
package cn.itcast.day25; import java.beans.BeanInfo; import java.beans.IntrospectionException; import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; //定义一个javaBean class Person { private int age ; private String name ; Person(int age ,String name) { this.age = age ; this.name = name ; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } } public class IntroSpectorTest { public static void main(String[] args)throws Exception { Person p = new Person(12,"lbx"); String propertyName1 = "age" ; String propertyName2 = "name"; Object retVal = null; Object value = "plj"; int flag = 0; //较为复杂的内省使用方式 BeanInfo beanInfo = Introspector.getBeanInfo(p.getClass());//获得javaBean的BeanInfo对象 PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();//获得这个javaBean的所有属性 for(PropertyDescriptor pd : pds) { if(pd.getName().equals(propertyName1)) { retVal = getProperty(p,propertyName1); //抽取封装方法后的代码 System.out.println(retVal); if(++flag == 2) break; } else if(pd.getName().equals(propertyName2)) { retVal = getProperty(p, propertyName2);//抽取封装方法后的代码 System.out.println(retVal); setProperty(p, propertyName2, value); if(++flag == 2) break; } } System.out.println(p.getName()); //简便写法,内省的简单应用 value = 15 ; setProperty(p, propertyName1, value); retVal = getProperty(p, propertyName1); System.out.println(retVal); } //抽取出的获得javaBean属性值的方法 private static Object getProperty(Person p, String propertyName1) throws IntrospectionException, IllegalAccessException, InvocationTargetException { Object retVal; PropertyDescriptor pd2 = new PropertyDescriptor(propertyName1, p.getClass()); //获得属性描述对象 Method getMethod = pd2.getReadMethod();//获得javaBean属性的get方法 retVal = getMethod.invoke(p);//反射调用 return retVal; } //抽取出的设置javaBean属性值的方法 private static void setProperty(Person p, String propertyName1, Object value) throws IntrospectionException, IllegalAccessException, InvocationTargetException { PropertyDescriptor pd = new PropertyDescriptor(propertyName1, p.getClass());//获得属性描述对象 Method setMethod = pd.getWriteMethod();//获得javaBean属性的set方法 setMethod.invoke(p, value);//反射调用 } }