Java Introspector(内省)
什么是内省?
Introspector
是专门用来处理javaBean
的工具类,用来访问某个属性的getter/setter
方法
JavaBean又是什么呢?
JavaBean
是一种特殊但又不完全特殊的类,主要用于传递数据信息。类中的方法主要用于访问私有字段,字段具备getter
和setter
方法
如果需要在两个类之间传递信息,可以将信息封装进JavaBean
中,这种对象称之为值对象(Value Object
)或者是VO
JavaBean
的信息在Introspector
里对应的概念是BeanInfo
,包含了JavaBean
的所有Description
(描述符)
内省和反射的区别
- 反射:反射就是运行时获取一个类的所有信息,可以获取到类的所有定义的信息(包括成员变量,成员方法,构造器等)可以操纵类的字段,方法,构造器等部分。可以想象为镜面反射或者照镜子,这样的操作是带有客观色彩的,也就是反射获取到的类信息必定正确的
- 内省:内省基于反射实现,主要用于操作
JavaBean
,基于JavaBean
的规范进行Bean
信息描述符的解析,依据于类的setter
和getter
方法,可以获取到类的描述符。可以想象为自我反省,带有主观色彩,不一定正确
常用的Introspector相关类
Introspector
类似于BeanInfo
的静态工厂类,主要是提供静态方法通过class
实例获取到BeanInfo
,得到BeanInfo
之后就能够获取到其他描述符
public static BeanInfo getBeanInfo(Class<?> beanClass) //通过Class实例获取到BeanInfo实例
BeanInfo
BeanInfo
是一个接口,具体实现是GenericBeanInfo
,通过这个接口可以获取一个类的各种类型的描述符
不正当使用Introspector会导致内存溢出
如果框架或者程序用到了JavaBeans Introspector
,那么就相当于起用了一个系统级别的缓存,这个缓存会存放一些曾加载并分析过的JavaBean
的引用,当web服务器关闭时,由于缓存中存放着这些JavaBean
引用,所以垃圾回收器不能进行回收