introspector 是 java 提供的用于分析 javabean 结构的工具类,通过 getbeaninfo 获取 beaninfo 并遍历 propertydescriptor 数组来发现符合规范的 getter/setter 方法,再调用 method.invoke 完成读写;需满足 javabean 规范,可缓存 propertydescriptor 或使用 apache commons beanutils 等封装工具。

Introspector 是 Java 提供的用于分析 JavaBean 结构的工具类,它不直接执行属性读写,而是帮助你发现符合 JavaBean 规范的 getter/setter 方法,再通过 PropertyDescriptor 获取对应的方法对象,最后用 Method.invoke() 完成实际读写。
获取 PropertyDescriptor 分析属性访问器
调用 Introspector.getBeanInfo(clazz) 获取 BeanInfo,再遍历其 PropertyDescriptor 数组,就能拿到每个属性对应的读写方法:
- 每个
PropertyDescriptor包含属性名、getter 方法(getReadMethod())和 setter 方法(getWriteMethod()) - 若属性只有 getter 没有 setter(如只读属性),
getWriteMethod()返回 null - 注意:必须确保目标类满足 JavaBean 规范(public 无参构造、属性私有、getter/setter 命名规范)
用 PropertyDescriptor 的方法完成读写操作
拿到 PropertyDescriptor 后,调用其 getReadMethod() 或 getWriteMethod() 得到 Method 对象,再用 invoke() 执行:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 读取:
readMethod.invoke(beanInstance) - 写入:
writeMethod.invoke(beanInstance, value) - 注意处理
IllegalAccessException和InvocationTargetException - 如果方法是 private(虽不符合标准 JavaBean,但某些场景存在),需先调用
setAccessible(true)
简化封装:避免重复解析
频繁使用时,建议缓存 PropertyDescriptor 或封装成工具方法:
- 用
Map<string propertydescriptor></string>按属性名缓存,避免每次调用Introspector.getBeanInfo()的开销 - 可借助
java.beans.PropertyUtils(Apache Commons BeanUtils)或 Spring 的BeanWrapper,它们内部基于 Introspector 封装了更易用的 API - 注意:Introspector 会缓存结果,但若动态修改了类结构(如热加载),需调用
Introspector.flushCaches()
常见问题与注意事项
实际使用中容易踩坑的地方:
- 静态属性、布尔类型 getter 命名为
isXxx()而非getXxx(),Introspector 能自动识别 - 属性名大小写敏感,且遵循驼峰规则;例如字段
userName对应 gettergetUserName() - 继承自父类的属性不会被默认包含,除非显式传入
Introspector.getBeanInfo(clazz, Object.class)指定停止基类 - 泛型信息在运行时擦除,PropertyDescriptor 无法反映泛型类型,只能获取原始方法签名
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










