javabean内省通过introspector自动解析属性,需类符合规范且有无参构造器;调用getbeaninfo获取beaninfo后提取propertydescriptor数组,注意过滤object方法、识别isxxx()布尔读法,并在热部署场景调用flushcaches清理缓存。

JavaBean 内省(Introspection)是通过 java.beans.Introspector 类自动发现 JavaBean 的属性、方法和事件的过程。它不依赖反射手动遍历,而是依据 JavaBean 规范(如 getter/setter 命名约定)解析出标准属性结构。
获取 BeanInfo 并提取属性描述符
核心是调用 Introspector.getBeanInfo(Class) 获取 BeanInfo 对象,再从中提取 PropertyDescriptor 数组:
- 传入目标类(如
User.class),注意该类需有无参构造器且符合 JavaBean 规范 - 默认会沿继承链向上查找父类的属性(可选传入
stopClass限制范围) -
getPropertyDescriptors()返回的数组包含所有公开属性(含从父类继承的),每个元素封装了属性名、读写方法(Method)、类型等信息
示例:
BeanInfo beanInfo = Introspector.getBeanInfo(User.class);
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor pd : pds) {
System.out.println("属性名: " + pd.getName());
System.out.println("类型: " + pd.getPropertyType());
System.out.println("读方法: " + pd.getReadMethod());
System.out.println("写方法: " + pd.getWriteMethod());
}
跳过 java.lang.Object 的公共方法
默认 getBeanInfo() 会包含 toString、hashCode 等来自 Object 的方法,导致误判为属性。解决方式有两种:
- 使用重载方法
Introspector.getBeanInfo(beanClass, Object.class),第二个参数指定“停止类”,即只内省该类及其子类,忽略Object及其祖先 - 手动过滤:遍历
PropertyDescriptor时检查pd.getReadMethod() != null && !pd.getReadMethod().getDeclaringClass().equals(Object.class)
处理布尔属性的 isXxx() 读方法
对于布尔类型属性(如 active),JavaBean 规范允许用 isActive() 代替 getActive()。Introspector 能自动识别这种命名:
- 只要存在 public
isXxx()方法(返回 boolean,无参),且满足首字母大写规则(如isActive→ 属性名active),就会被当作该属性的读方法 -
PropertyDescriptor.getReadMethod()将返回isXxx()方法而非getXxx() - 写方法仍必须是
setXxx(boolean)形式
缓存与线程安全注意事项
Introspector 内部使用静态缓存提升性能,但可能引发内存泄漏或状态污染:
- 缓存基于 ClassLoader,若在 Web 容器中频繁部署/卸载应用(如 Tomcat 热部署),旧 ClassLoader 关联的 BeanInfo 可能无法回收
- 建议在应用关闭或类加载器销毁前调用
Introspector.flushCaches()清理全局缓存 -
Introspector类本身是线程安全的,但返回的BeanInfo和PropertyDescriptor实例不可变,可安全共享
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











