浅谈Java内省

摘要:讲内省,不得不说Java Bean,Bean在Java中是一种特殊的类,主要用于装载数据,数据会被存储在类的私有属性中,通常具有无参构造函数、可序列化、以及通过getter和setter方法来访问属性。内省是Java Beans规范的一部分,使用java.be

讲内省,不得不说Java Bean,Bean在Java中是一种特殊的类,主要用于装载数据,数据会被存储在类的私有属性中,通常具有无参构造函数、可序列化、以及通过getter和setter方法来访问属性。内省是Java Beans规范的一部分,使用java.beans包中的类来实现,最常用的类是Introspector。通过内省,你可以获取一个Java Bean的属性描述符(PropertyDescriptor)和方法描述符(MethodDescriptor)BeanInfo beanInfo = Introspector.getBeanInfo(Vehicle.class);getPropertyDescriptorsPropertyDescriptor propertyDescriptors = beanInfo.getPropertyDescriptors;getMethodDescriptorsMethodDescriptor methodDescriptors = beanInfo.getMethodDescriptors;getEventSetDescriptorsEventSetDescriptor eventSetDescriptors = beanInfo.getEventSetDescriptors;PropertyDescriptor namePD = new PropertyDescriptor("name", Vehicle.class);String name = namePD.getName;getReadMethodPropertyDescriptor namePD = new PropertyDescriptor("name", Vehicle.class);Method getter = namePD.getReadMethod;String methodName = getter.getName;String vehicleName = (String) getter.invoke(new Vehicle);getWriteMethodPropertyDescriptor namePD = new PropertyDescriptor("name", Vehicle.class);Method setter = namePD.getWriteMethod;String methodName = setter.getName;setter.invoke(new Vehicle, "JD0001");MethodDescriptor methodDescriptor = new MethodDescriptor(Vehicle.class.getMethod("setName", String.class));String name = methodDescriptor.getName;getMethodMethodDescriptor methodDescriptor = new MethodDescriptor(Vehicle.class.getMethod("setName", String.class));Method method = methodDescriptor.getMethod;method.invoke(new Vehicle, "JD0001");三、内省常见使用场景1、依赖注入Spring使用内省来分析类的构造函数、字段和方法,并自动注入依赖对象,可参考BeanWrapperImpl,部分源码如下:@Overridepublic PropertyDescriptor getPropertyDescriptors { return getCachedIntrospectionResults.getPropertyDescriptors;}2、对象拷贝Spring BeanUtils使用内省来复制对象的属性,可参考BeanUtils,部分源码如下:public static PropertyDescriptor getPropertyDescriptors(Class clazz) throws BeansException { return CachedIntrospectionResults.forClass(clazz).getPropertyDescriptors;}开发工具和集成开发环境(IDE,如IntelliJ IDEA)使用内省来提供代码补全、重构、调试等功能四、内省优缺点1、优点灵活性和可扩展性:允许在运行时动态地获取和操作对象的属性和方法简化开发工作:支持框架和工具的开发,能够自动处理对象的属性和方法2、缺点性能开销:比直接调用方法或访问字段要慢,而且不当使用可能会导致内存泄漏或增加GC压力访问安全:绕过Java的访问控制机制,访问私有字段和方法,可能会带来安全隐患,特别是在处理敏感数据时类型安全:通常是基于字符串名称进行的(如方法名、属性名),在编译时无法检查其正确性,容易导致运行时错误可读性和可维护性:代码可读性差,增加调试难度内省主要用于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

来源:京东云开发者

相关推荐