当前位置: 首页 > news >正文

Java的反射原理

反射允许程序在运行时检查或修改其类、接口、字段和方法的行为。反射主要通过java.lang.reflect包中的类和接口实现,它主要用于以下目的:

  1. 在运行时分析类的能力:通过反射,可以在运行时检查类的结构,比如它的方法、构造函数、字段等。
  2. 在运行时查看对象:可以调用对象的私有方法和访问私有字段(尽管这通常不推荐,因为它破坏了封装性)。
  3. 实现通用的数组操作代码:通过反射,可以编写能够操作任何类型数组的代码。
  4. 利用动态代理:反射经常与动态代理一起使用,以在运行时创建接口的代理实现。

反射的基本用法

反射主要通过以下几个类来实现:

  • Class:代表正在运行的Java应用程序中的类和接口。
  • Field:提供有关类或接口的字段的信息,以及对它的动态访问权限。
  • Method:提供关于类或接口的方法的信息,以及对它的动态访问权限。
  • Constructor:提供关于类的构造方法的信息,以及对它的动态访问权限。
获取Class对象

获取Class对象有三种常见方式:

  1. 使用Class.forName("完全限定名")静态方法(可能抛出ClassNotFoundException)。
  2. 使用类名.class语法。
  3. 使用对象的getClass()方法。

通过class对象获取对象的属性

获取指定属性名的public属性——getField(属性名)

获取全部public属性——getFields()

获取已声明的指定属性名的属性——getDeclaredField(属性名)

获取已声明的所有属性——getDeclaredFields() 

获取属性的类型、名字、修饰符
获取属性值——get(对象名)

对于public和protected属性,可以直接get和set

 对于private属性,必须要设置可访问,才可get和set

修改属性值——set(对象名,属性值)

 记得private属性必须要setAccessible(true)

通过class对象获取对象的构造器
 

上图只有2个构造方法,一个是有一个参数的,一个是有2个参数的

获取特定参数类型、个数的构造器——getConstructor(参数类型的class对象)
获取所有构造器——getConstructors()

获取构造器的参数——getParameters()
 通过class对象获取对象的方法
根据方法名获取已声明的方法——getDeclaredMethod(方法名,参数类型的class对象)

根据方法名获取public方法——getMethod(方法名,参数类型的class对象) 

获取所有public方法——getMethods() 

这里不仅包括对象(aClass)的所有public方法,还包括该对象隐式继承的object类中的public方法

 获取所有已声明方法——getDeclaredMethods() 

 获取方法返回类型——getReturnType()

获取方法上注解为@xxx的方法——getAnnotation(注解的class对象)
获取方法的名字——getName()
 修改方法中的参数并重新执行——invoke(对象,修改后的参数)

原来给output方法传的参数是“”,通过invoke函数修改参数并重新执行该对象的output函数后,参数改变了。

执行对象中的private方法——invoke(对象)

给类添加一个private方法 

通过反射执行

小结——对于对象
  •  只想获取public属性就使用getField(属性名)或getFields()
  • 想获取任意属性(不局限于public、protected、private)就使用getDeclaredField(属性名)或getDeclaredFields()
  • 想获取属性的类型用getType(),想获取属性的名字用getName(),想获取属性的修饰符用getModifiers()
  • 想获取属性的值用get(对象),想设置属性的值用set(对象,值),private属性得先将属性设置为可达setAccessible(),才能get()和set()
  • 想获取指定参数个数类型的构造器就使用getConstructor()
  • 想获取所有构造器就使用getConstructors()
  • 获取构造器的参数就使用getParameters()
  • 只想获取public方法就使用getMethod(方法名)或getMethods()(后者会获取到继承类上的public方法)
  • 想获取任意方法(不局限于public、protected、private)就使用getDeclaredMethod(方法名)或getDeclaredMethods()
  • 想获取方法上的注解就使用getAnnotation(注解的class类)
  • 想获取方法的返回值就使用getReturnType()
  • 想获取方法名就使用getName()
  • 想执行方法就用invoke(对象)
  • 想修改方法所传参数的值并重新执行该方法就使用invoke(对象,修改后的值)

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 天途推出无人机软硬件定制服务
  • Velero 快速上手:使用 Velero 实现 Kubernetes 集群备份与迁移
  • Java设计模式-责任链模式
  • 酷炫时尚未来科技视频开头PR模板MOGRT
  • zabbix的setup无法进入第二步
  • 单细胞irGSEA分析:整合多种富集分析方式的R包
  • 数据中台之数据开发-离线开发和实时开发
  • 超级外链工具,可发9600条优质外链
  • Linux--传输层协议UDP
  • 排序算法之堆排序
  • 前端案例:极速问诊项目(移动端自适应)(HTML+CSS+JS)
  • 使用Form表单进行数据提交的最佳实践与安全措施
  • 【HNOI2003】操作系统Java
  • MySQL 主从复制的过程
  • 用ESP32IDF 新版本5.3.0读写16口输入或者输出PCF8575程序编写
  • 10个最佳ES6特性 ES7与ES8的特性
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • Promise初体验
  • Vue ES6 Jade Scss Webpack Gulp
  • web标准化(下)
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 机器学习 vs. 深度学习
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 聊聊hikari连接池的leakDetectionThreshold
  • 实战|智能家居行业移动应用性能分析
  • 应用生命周期终极 DevOps 工具包
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • ​【已解决】npm install​卡主不动的情况
  • !!java web学习笔记(一到五)
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • # 计算机视觉入门
  • # 利刃出鞘_Tomcat 核心原理解析(二)
  • #define、const、typedef的差别
  • #java学习笔记(面向对象)----(未完结)
  • #NOIP 2014# day.1 T2 联合权值
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • (2)从源码角度聊聊Jetpack Navigator的工作流程
  • (2024最新)CentOS 7上在线安装MySQL 5.7|喂饭级教程
  • (3) cmake编译多个cpp文件
  • (3)nginx 配置(nginx.conf)
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (ISPRS,2021)具有遥感知识图谱的鲁棒深度对齐网络用于零样本和广义零样本遥感图像场景分类
  • (java)关于Thread的挂起和恢复
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (回溯) LeetCode 78. 子集
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .Net IOC框架入门之一 Unity
  • /3GB和/USERVA开关
  • ??Nginx实现会话保持_Nginx会话保持与Redis的结合_Nginx实现四层负载均衡
  • [ 云计算 | Azure 实践 ] 在 Azure 门户中创建 VM 虚拟机并进行验证
  • [16/N]论得趣
  • [18] Opencv_CUDA应用之 基于颜色的对象检测与跟踪
  • [ACL2022] Text Smoothing: 一种在文本分类任务上的数据增强方法