0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

浅谈Java内省

京东云 来源:京东物流 王国泰 作者:京东物流 王国泰 2024-12-19 10:36 次阅读

作者:京东物流 王国泰

一、什么是内省

讲内省,不得不说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

BeanInfo beanInfo = Introspector.getBeanInfo(Vehicle.class);

3、BeanInfo

3.1 核心功能

用于提供有关Bean的元数据,通常用于描述Bean的属性、事件和方法

3.2 核心方法

getPropertyDescriptors

PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();

getMethodDescriptors

MethodDescriptor[] methodDescriptors = beanInfo.getMethodDescriptors();

getEventSetDescriptors

EventSetDescriptor[] eventSetDescriptors = beanInfo.getEventSetDescriptors();

4、PropertyDescriptor

4.1 核心功能

用于描述Bean的属性,提供了对属性的详细描述,包括属性的名称、类型、读方法getter、写方法setter等

4.2 核心方法

getName

PropertyDescriptor namePD = new PropertyDescriptor("name", Vehicle.class);
String name = namePD.getName();

getReadMethod

PropertyDescriptor namePD = new PropertyDescriptor("name", Vehicle.class);
Method getter = namePD.getReadMethod();

String methodName = getter.getName();
String vehicleName = (String) getter.invoke(new Vehicle());

getWriteMethod

PropertyDescriptor namePD = new PropertyDescriptor("name", Vehicle.class);
Method setter = namePD.getWriteMethod();

String methodName = setter.getName();
setter.invoke(new Vehicle(), "JD0001");

5、MethodDescriptor

5.1 核心功能

用于描述一个方法的属性,提供了对方法的详细描述,包括方法的名称、参数类型、返回类型等

5.2 核心方法

getName

MethodDescriptor methodDescriptor = new MethodDescriptor(Vehicle.class.getMethod("setName", String.class));
String name = methodDescriptor.getName();

getMethod

MethodDescriptor methodDescriptor = new MethodDescriptor(Vehicle.class.getMethod("setName", String.class));
Method method = methodDescriptor.getMethod();
method.invoke(new Vehicle(), "JD0001");

6、EventSetDescriptor

6.1 核心功能

用于描述一个Bean能够触发的一组事件,提供了有关事件监听器类型、添加和移除监听器的方法以及事件通知方法的信息

6.2 核心方法

不常用

三、内省常见使用场景

1、依赖注入

Spring使用内省来分析类的构造函数、字段和方法,并自动注入依赖对象,可参考BeanWrapperImpl,部分源码如下:

@Override
public PropertyDescriptor[] getPropertyDescriptors() {
  return getCachedIntrospectionResults().getPropertyDescriptors();
}

2、对象拷贝

Spring BeanUtils使用内省来复制对象的属性,可参考BeanUtils,部分源码如下:

public static PropertyDescriptor[] getPropertyDescriptors(Class< ? > clazz) throws BeansException {
  return CachedIntrospectionResults.forClass(clazz).getPropertyDescriptors();
}

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


审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    19

    文章

    2968

    浏览量

    104774
收藏 人收藏

    评论

    相关推荐

    Java基础知识:内省#Java

    JAVA
    学习硬声知识
    发布于 :2022年11月16日 17:54:46

    PCB经验浅谈

    PCB经验浅谈
    发表于 08-04 09:33

    手机硬件知识浅谈

    手机硬件知识浅谈
    发表于 05-15 11:04

    浅谈射频PCB设计

    浅谈射频PCB设计
    发表于 03-20 15:07

    Java SE、Java EE、Java ME之间的区别

    本文把JAVA SE、JAVA EE、JAVA ME拿来做下区别,同时也分享一下作者的一些成果。目前的Java平台根据软件开发人员、服务提供商和设备生产商可以针对特定的市场可以分为三个
    发表于 07-11 08:31

    浅谈Java虚拟机的研究与移植

    Kaffe移植的关键技术及方案基于ST20嵌入式系统的Java虚拟机研究与移植
    发表于 04-25 09:49

    Java的类

    1.1 有关面向对象的概念1.2 Java语言的特点1.3 Java的开发环境1.4  第一个Java程序1.5 Java类型系统1.6
    发表于 04-28 14:23 0次下载

    java是什么?java概念解释

    电子发烧友网站提供《java是什么?java概念解释.pdf》资料免费下载
    发表于 04-17 21:35 0次下载

    JAVA教程之Java画图程序

    JAVA教程之Java画图程序,很好的JAVA的资料,快来学习吧
    发表于 04-11 17:28 13次下载

    解析c++语言的Qt内省机制

    所谓 内省 是指面向对象语言的一种在运行期间查询对象信息的能力, 比如如果该语具有运行期间检查对象型别的能力,那么我们称它是型别 内省 (type intropection)的,型别 内省 可以用
    发表于 12-15 10:22 1496次阅读

    虚拟机内省与内存安全监测

    针对在传统特权虚拟机中利用虚拟机内省实时监测其他虚拟机内存安全的方法不利于安全模块与系统其他部分的隔离,且会拖慢虚拟平台的整体性能的问题,提出基于轻量操作系统实现虚拟机内省的安全架构,并提出基于内存
    发表于 01-08 14:15 0次下载
    虚拟机<b class='flag-5'>内省</b>与内存安全监测

    java基础——java.util.ConcurrentModificationException

    本文档内容介绍了java基础java.util.ConcurrentModificationException,供参考
    发表于 03-13 11:31 2次下载

    浅谈Java编程学习 Java基础语法注意项

    每当说到IT行业时,很多朋友们会想到java,随着时代的发展,人们学习java的热度依然只增不减,但关于java,有人会问基础语法是怎样的,该如何学习?
    发表于 05-30 16:34 1016次阅读

    Java程序设计教程之Java语言的基础知识概述

    本文档详细介绍的是Java程序设计教程之Java语言的基础知识概述主要内容包括了:1.Java语言发展简史,2.Java的特点(为什么要学习java
    发表于 02-22 10:28 36次下载
    <b class='flag-5'>Java</b>程序设计教程之<b class='flag-5'>Java</b>语言的基础知识概述

    华纳云:java web和java有什么区别java web和java有什么区别

    Java Web和Java是两个不同的概念,它们在功能、用途和实现方式上存在一些区别,下面将详细介绍它们之间的区别。 1. 功能和用途: – Java是一种编程语言,它提供了一种用于开发各种应用程序
    的头像 发表于 07-16 13:35 812次阅读
    华纳云:<b class='flag-5'>java</b> web和<b class='flag-5'>java</b>有什么区别<b class='flag-5'>java</b> web和<b class='flag-5'>java</b>有什么区别