千家信息网

Java内省Introspector相关类有哪些

发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,本篇内容主要讲解"Java内省Introspector相关类有哪些",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Java内省Introspector相关类
千家信息网最后更新 2025年02月01日Java内省Introspector相关类有哪些

本篇内容主要讲解"Java内省Introspector相关类有哪些",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Java内省Introspector相关类有哪些"吧!

JavaBean是什么

JavaBean是一种特殊(其实说普通也可以,也不是十分特殊)的类,主要用于传递数据信息,这种类中的方法主要用于访问私有的字段,且方法名符合某种命名规则(字段都是私有,每个字段具备SetterGetter方法,方法和字段命名满足首字母小写驼峰命名规则)。如果在两个模块之间传递信息,可以将信息封装进JavaBean中,这种对象称为值对象(Value Object)或者VO。这些信息储存在类的私有变量中,通过SetterGetter方法获得。JavaBean的信息在Introspector里对应的概念是BeanInfo,它包含了JavaBean所有的Descriptor(描述符),主要有PropertyDescriptorMethodDescriptorMethodDescriptor里面包含ParameterDescriptor)、BeanDescriptorEventSetDescriptor

属性Field和属性描述PropertiesDescriptor的区别

如果是严格的JavaBean(Field名称不重复,并且Field具备SetterGetter方法),它的PropertyDescriptor会通过解析SetterGetter方法,合并解析结果,最终得到对应的PropertyDescriptor实例。所以PropertyDescriptor包含了属性名称和属性的SetterGetter方法(如果存在的话)。

内省Introspector和反射Reflection的区别

  • Reflection:反射就是运行时获取一个类的所有信息,可以获取到类的所有定义的信息(包括成员变量,成员方法,构造器等)可以操纵类的字段、方法、构造器等部分。可以想象为镜面反射或者照镜子,这样的操作是带有客观色彩的,也就是反射获取到的类信息是必定正确的。
  • Introspector:内省基于反射实现,主要用于操作 JavaBean,基于 JavaBean的规范进行 Bean信息描述符的解析,依据于类的 SetterGetter方法,可以获取到类的描述符。可以想象为"自我反省",这样的操作带有主观的色彩,不一定是正确的(如果一个类中的属性没有 SetterGetter方法,无法使用 Introspector)。

常用的Introspector相关类

主要介绍一下几个核心类所提供的方法。

Introspector

Introspector类似于BeanInfo的静态工厂类,主要是提供静态方法通过Class实例获取到BeanInfo,得到BeanInfo之后,就能够获取到其他描述符。主要方法:

  • public static BeanInfo getBeanInfo(Class beanClass):通过 Class实例获取到 BeanInfo实例。

BeanInfo

BeanInfo是一个接口,具体实现是GenericBeanInfo,通过这个接口可以获取一个类的各种类型的描述符。主要方法:

  • BeanDescriptor getBeanDescriptor():获取 JavaBean描述符。
  • EventSetDescriptor[] getEventSetDescriptors():获取 JavaBean的所有的 EventSetDescriptor
  • PropertyDescriptor[] getPropertyDescriptors():获取 JavaBean的所有的 PropertyDescriptor
  • MethodDescriptor[] getMethodDescriptors():获取 JavaBean的所有的 MethodDescriptor

这里要注意一点,通过BeanInfo#getPropertyDescriptors()获取到的PropertyDescriptor数组中,除了Bean属性的之外,「还会带有一个属性名为classPropertyDescriptor实例」,它的来源是ClassgetClass方法,如果不需要这个属性那么最好判断后过滤,这一点需要紧记,否则容易出现问题。

PropertyDescriptor

PropertyDescriptor类表示JavaBean类通过存储器(SetterGetter)导出一个属性,它应该是内省体系中最常见的类。主要方法:

  • synchronized Class getPropertyType():获得属性的 Class对象。
  • synchronized Method getReadMethod():获得用于读取属性值( Getter)的方法;
  • synchronized Method getWriteMethod():获得用于写入属性值( Setter)的方法。
  • int hashCode():获取对象的哈希值。
  • synchronized void setReadMethod(Method readMethod):设置用于读取属性值( Getter)的方法。
  • synchronized void setWriteMethod(Method writeMethod):设置用于写入属性值( Setter)的方法。

举个例子:

public class Main {

public static void main(String[] args) throws Exception {
BeanInfo beanInfo = Introspector.getBeanInfo(Person.class);
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
if (!"class".equals(propertyDescriptor.getName())) {
System.out.println(propertyDescriptor.getName());
System.out.println(propertyDescriptor.getWriteMethod().getName());
System.out.println(propertyDescriptor.getReadMethod().getName());
System.out.println("=======================");
}
}
}

public static class Person {

private Long id;
private String name;
private Integer age;

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Integer getAge() {
return age;
}

public void setAge(Integer age) {
this.age = age;
}
}
}

输出结果:

age
setAge
getAge
=======================
id
setId
getId
=======================
name
setName
getName
=======================

不正当使用Introspector会导致内存溢出

如果框架或者程序用到了JavaBeans Introspector,那么就相当于「启用了一个系统级别的缓存」,这个缓存会存放一些曾加载并分析过的Javabean的引用,当Web服务器关闭的时候,由于这个缓存中存放着这些Javabean的引用,所以垃圾回收器不能对Web容器中的JavaBean对象进行回收,导致内存越来越大。还有一点值得注意,清除Introspector缓存的唯一方式是刷新整个缓存缓冲区,这是因为JDK没法判断哪些是属于当前的应用的引用,所以刷新整个Introspector缓存缓冲区会导致把服务器的所有应用的Introspector缓存都删掉。Spring中提供的org.springframework.web.util.IntrospectorCleanupListener就是为了解决这个问题,它会在Web服务器停止的时候,清理一下这个Introspector缓存,使那些Javabean能被垃圾回收器正确回收。

也就是说JDKIntrospector缓存管理是有一定缺陷的。但是如果使用在Spring体系则不会出现这种问题,因为SpringIntrospector缓存的管理移交到Spring自身而不是JDK(或者在Web容器销毁后完全不管),在加载并分析完所有类之后,会针对类加载器对Introspector缓存进行清理,避免内存泄漏的问题,详情可以看CachedIntrospectionResultsSpringBoot刷新上下文的方法AbstractApplicationContext#refresh()finally代码块中存在清理缓存的方法AbstractApplicationContext#resetCommonCaches();。但是有很多程序和框架在使用了JavaBeans Introspector之后,都没有进行清理工作,比如QuartzStruts等,这类操作会成为内存泄漏的隐患。

到此,相信大家对"Java内省Introspector相关类有哪些"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

方法 属性 缓存 信息 字段 实例 对象 反射 内存 问题 服务器 服务 私有 特殊 也就是 体系 内容 变量 名称 垃圾 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 集团公司实行网络安全通报制度 手机版的无政府服务器 光速服务器 未转变者服务器当面刷新物品 浦东新区使用软件开发质量保障 因保证金服务器故障导致无法开标 软件开发业务能力和专长 lol服务器bug教学 服务器出差什么意思 Steam 游戏服务器帐户管理 步道乐跑连接不到服务器怎么回事 经济安全包括网络安全吗 互联网科技企业行业中位水平 服务器虚拟化规划 地产数据库 武昌医院网络安全 互联网科技大佬的学历 wifi远端服务器无响应 木瓜互联网科技素材图片背景 中华人民共和国网络安全法电子版 CGOD数据库哪些学校有 软件开发行业平均利润 成都英诺森互联网科技有限公司 大学计算机网络技术考点 南网网络安全制度 陕西创新网络技术服务怎么样 互联网时代科技特点 崇明区数据软件开发常见问题 温州网络技术开发项目 苏州网络技术服务有哪些
0