目的和作用: 通过内省,获取和操作javaBean中的成员信息(方法,事件,属性)。
—————————————————-内省使用的核心类(接口)———————————————————–
Java.beans.Introspector –工具类,通过 Introspector 类就可以获取和操作javaBean中的属性、事件和方法。(static BeanInfo)getBeanInfo(Class> beanClass)
通过 某个类.class的字节码对象 获取 JavaBean,返回 beanInfo对象— eg : getBeanInfo(类.class , Object.class ) 包括类.class,但不包括Object.class
java.beans.beanInfo—Bean的描述对象,可以通过它取得Bean内部的信息。(MethodDescriptor[ ]) getMethodDescriptors()
获得 beans 方法描述符(PropertyDescriptor[ ]) getPropertyDescriptors()
获取javaBaen中所有属性的描述器 ( 描述属性的信息 )
java.beans.PropertyDescriptor— Bean的属性描述器,它提供了一系列对Bean属性进行操作的方法(Method) getReadMethod()
获得 get 属性值的方法。 之后可以用反射 Method.invoke()(Method) getWriteMethod()
获得 set 属性值的方法。(String) getName()
获得属性名称。(Class) getPropertyType()
获得属性的类型 eg : class: java.lang.String
一般步骤:通过类 Introspector来获取某个对象的 BeanInfo 信息
然后通过 BeanInfo来获取属性的描述器 PropertyDescriptor
通过这个属性描述器就可以获取某个属性对应的 getter/setter方法,然后我们就可以通过反射机制来调用这些方法。
反射和内省的区别:
反射反射就是运行时获取一个类的所有信息,可以获取到.class的任何定义的信息(包括成员 变量,成员方法,构造器等)可以操纵类的字段、方法、构造器等部分。
内省:内省基于反射实现,主要用于操作JavaBean,通过内省 可以获取bean的getter/setter
生活中 反射就像我们照镜子,照镜子时候 你的所有信息会毫无出错毫无保留的反射到镜子中,而java中反射就像是运行时用一把镜子去照.class字节码 将这个类的所有信息照出来,‘照’出的结果是客观的,是正确的;
内省就像我们反省自己,通常我们是针对犯错而进行反省,根据所犯错误反省总结出结论,这个结论是主观的,不一定正确的,有时候你觉得你自己做错了,但可能事实上自己无可厚非。java中内省,是针对javaBean进行的,目的是为了找出bean的getter和setter以便操作这个bean。只要看到有getter或者setter 就认为这个类有那么一个字段,比如看到getName() 内省就会认为这个类中有name字段,但事实上并不一定会有name;