浅谈 Java 内省
作者:京东物流 王国泰
一、什么是内省
讲内省,不得不说 Java Bean,Bean 在 Java 中是一种特殊的类,主要用于装载数据,数据会被存储在类的私有属性中,通常具有无参构造函数、可序列化、以及通过 getter 和 setter 方法来访问属性。内省是 Java Beans 规范的一部分,使用 java.beans 包中的类来实现,最常用的类是 Introspector。通过内省,你可以获取一个 Java Bean 的属性描述符(PropertyDescriptor)和方法描述符(MethodDescriptor)
二、内省常用 API
1、相关类
2、Introspector
2.1 核心功能
用于获取 Bean 的整体信息,包括属性描述符、方法描述符和事件描述符等
2.2 核心方法
getBeanInfo
3、BeanInfo
3.1 核心功能
用于提供有关 Bean 的元数据,通常用于描述 Bean 的属性、事件和方法
3.2 核心方法
getPropertyDescriptors
getMethodDescriptors
getEventSetDescriptors
4、PropertyDescriptor
4.1 核心功能
用于描述 Bean 的属性,提供了对属性的详细描述,包括属性的名称、类型、读方法 getter、写方法 setter 等
4.2 核心方法
getName
getReadMethod
getWriteMethod
5、MethodDescriptor
5.1 核心功能
用于描述一个方法的属性,提供了对方法的详细描述,包括方法的名称、参数类型、返回类型等
5.2 核心方法
getName
getMethod
6、EventSetDescriptor
6.1 核心功能
用于描述一个 Bean 能够触发的一组事件,提供了有关事件监听器类型、添加和移除监听器的方法以及事件通知方法的信息
6.2 核心方法
不常用
三、内省常见使用场景
1、依赖注入
Spring 使用内省来分析类的构造函数、字段和方法,并自动注入依赖对象,可参考 BeanWrapperImpl,部分源码如下:
2、对象拷贝
Spring BeanUtils 使用内省来复制对象的属性,可参考 BeanUtils,部分源码如下:
3、开发工具和 IDE
开发工具和集成开发环境(IDE,如 IntelliJ IDEA)使用内省来提供代码补全、重构、调试等功能
四、内省优缺点
1、优点
灵活性和可扩展性:允许在运行时动态地获取和操作对象的属性和方法
简化开发工作:支持框架和工具的开发,能够自动处理对象的属性和方法
2、缺点
性能开销:比直接调用方法或访问字段要慢,而且不当使用可能会导致内存泄漏或增加 GC 压力
访问安全:绕过 Java 的访问控制机制,访问私有字段和方法,可能会带来安全隐患,特别是在处理敏感数据时
类型安全:通常是基于字符串名称进行的(如方法名、属性名),在编译时无法检查其正确性,容易导致运行时错误
可读性和可维护性:代码可读性差,增加调试难度
五、内省与反射的区别
1、用途
内省主要用于 Java Bean 的属性操作,适合于标准化的 Bean 操作
反射则是更通用的机制,可以操作类的所有成员,包括私有成员
2、实现
内省是基于 Java Beans 规范的,使用 java.beans 包
反射是 Java 语言的核心特性,使用 java.lang.reflect 包
3、性能
内省通常比反射快,主要原因是内省使用了缓存机制,减少了权限检查,并且在设计上针对特定场景进行了优化
相关文献
JavaBeans API Specification:https://docs.oracle.com/javase/8/docs/api/java/beans/package-summary.html
《Java 编程思想》(Thinking in Java) - Bruce Eckel
《Java 核心技术 卷 I》(Core Java Volume I) - Cay S. Horstmann, Gary Cornell
《Java 反射机制详解》(Java Reflection in Action) - Ira R. Forman, Nate Forman
版权声明: 本文为 InfoQ 作者【京东科技开发者】的原创文章。
原文链接:【http://xie.infoq.cn/article/22ae81667185951caab10c72e】。文章转载请联系作者。
评论