java中反射(Reflection)的4个作用

java中反射(Reflection)的4个作用

  • 作用1、在运行时判断任意一个对象所属的类
  • 作用2、在运行时构造任意一个类的对象
  • 作用3、在运行时判断任意一个类所具有的成员变量和方法
  • 作用4、在运行时调用任意一个对象的方法
  • 总结


💖The Begin💖点点关注,收藏不迷路💖

反射(Reflection)是Java等编程语言中的一个重要特性,它允许程序在运行时进行自我检查和对内部成员(如字段、方法、类等)的操作。本文将详细介绍反射的主要作用,并通过Java示例来说明。

作用1、在运行时判断任意一个对象所属的类

反射提供了getClass()方法,使得我们可以获取对象的运行时类信息。通过这个方法,我们可以判断一个对象属于哪个类。

Object obj = "Hello, Reflection!";  
Class<?> objClass = obj.getClass();  
System.out.println("对象所属类: " + objClass.getName()); // 输出: 对象所属类: java.lang.String

作用2、在运行时构造任意一个类的对象

通过反射,我们可以使用Class对象的newInstance()方法(或其替代方法如getDeclaredConstructor().newInstance())来动态地创建类的实例。

try {  Class<?> stringClass = String.class;  Object strInstance = stringClass.getDeclaredConstructor().newInstance();  // 注意:String类有一个无参构造器,否则上述代码会抛出异常  System.out.println("通过反射创建的String实例: " + strInstance); // 输出: 通过反射创建的String实例:   
} catch (Exception e) {  e.printStackTrace();  
}

作用3、在运行时判断任意一个类所具有的成员变量和方法

通过反射,我们可以获取类的所有成员变量(字段)和方法,并可以检查它们的修饰符、参数等信息。

Class<?> stringClass = String.class;  // 获取所有公共字段  
Field[] fields = stringClass.getFields();  
for (Field field : fields) {  System.out.println("公共字段: " + field.getName());  
}  // 获取所有方法(包括公共、保护、默认和私有)  
Method[] methods = stringClass.getDeclaredMethods();  
for (Method method : methods) {  System.out.println("方法: " + method.getName());  
}

作用4、在运行时调用任意一个对象的方法

通过反射,我们可以调用对象的任何可见(public)或私有(private,通过setAccessible(true)方法)方法。

try {  String str = "Hello";  Class<?> stringClass = str.getClass();  Method lengthMethod = stringClass.getMethod("length");  int length = (int) lengthMethod.invoke(str);  System.out.println("字符串长度: " + length); // 输出: 字符串长度: 5  
} catch (Exception e) {  e.printStackTrace();  
}

总结

反射提供了强大的运行时操作类、对象、字段和方法的能力,这使得Java等语言更加灵活和动态。

然而,反射也有一些缺点,比如性能开销较大,并且可能会破坏封装性。

在这里插入图片描述


💖The End💖点点关注,收藏不迷路💖

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/42685.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Android】自定义换肤框架05之Skinner框架集成

引入依赖 api("io.github.hellogoogle2000:android-skinner:1.0.0")初始化Skinner 在所有功能前调用即可&#xff0c;建议在Application中初始化 SkinnerKit.init(application)安装皮肤包 在应用该皮肤包前安装即可&#xff0c;建议预安装&#xff0c;或应用皮肤…

ABAP中MESSAGE_TEXT_BUILD函数的详细使用方法

MESSAGE_TEXT_BUILD 是 ABAP 中的一个函数&#xff0c;用于根据给定的消息类和消息号构建一个完整的消息文本。这个函数通常与消息类&#xff08;如 ‘E’, ‘W’, ‘I’, ‘S’, ‘A’ 等&#xff09;和消息号一起使用&#xff0c;这些通常定义在数据字典&#xff08;Transact…

扩散模型笔记2

Ref:扩散模型的原理及实现&#xff08;Pytorch&#xff09; 在扩散模型中&#xff0c;每一步添加的噪声并不是完全一样的。具体来说&#xff0c;噪声的添加方式和量在每一步是根据特定的规则或公式变化的。这里我们详细解释每一步添加噪声的过程。 正向过程中的噪声添加&…

vb.netcad二开自学笔记9:界面之ribbon

一个成熟的软件怎么能没有ribbon呢&#xff0c;在前面的框架基础上再加个命令AddRibbon <CommandMethod("AddRibbon")> Public Sub AddRibbon() Dim ribbonControl As RibbonControl ComponentManager.Ribbon Dim tab As RibbonTab New RibbonTab() tab.Tit…

Linux 高级 Shell 脚本编程:掌握 Shell 脚本精髓,提升工作效率

【Linux】 高级 Shell 脚本编程&#xff1a;掌握 Shell 脚本精髓&#xff0c;提升工作效率 Shell 脚本编程是 Linux 系统管理员和开发人员的必备技能。通过学习高级 Shell 脚本编程&#xff0c;你可以编写更高效、更灵活和更易于维护的脚本。本文将介绍 Shell 脚本编程中的函数…

初中化学知识点总结(人教版)

第一单元 走进化学世界 一 物质的变化和性质 1物理变化&#xff1a;没有生成其它物质的变化叫做物理变化。 化学变化&#xff1a;生成其他物质的变化叫做化学变化&#xff0c;又叫化学反应。 物理变化和化学变化的区别&#xff1a;是否有其他物质生产。 2化学变化的基本特…

Python - 自动化办公,将yml根据转换规则转换成‘‘ = ‘‘

文章目录 前言## Python - 自动化办公&#xff0c;将yml根据转换规则转换成 1. 准备工作2. demo3. 测试 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会…

【教程】新的Selenium!整合了隐藏浏览器指纹等功能

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 目录 前景提要 driver Driver() 常用driver 接口 最后的话 前景提要 新的selenium&#xff0c;整合了隐藏浏览器指纹&#xff0c;非常好用&#x…

算法库应用--KMP算法解决串匹配问题

学习来源 学习贺利坚老师博客 数据结构例程——串的模式匹配&#xff08;KMP算法&#xff09;_数据结构模式匹配例题-CSDN博客 本人引导博客 串的匹配 (KPM算法由来引导)_kpm匹配失败-CSDN博客 转载大佬sofu博客 https://www.cnblogs.com/dusf/p/kmp.html 本人详细思路引导b战…

代码随想录算法训练营第四十九天| 300.最长递增子序列 , 674. 最长连续递增序列 , 718. 最长重复子数组

300. 最长递增子序列 - 力扣&#xff08;LeetCode&#xff09; class Solution {public int lengthOfLIS(int[] nums) {int[] dp new int[nums.length];dp[0] 1;for(int i1;i<nums.length;i){for(int j0;j<i;j){if(nums[i] > nums[j]){dp[i] Math.max(dp[j],dp[i])…

【Spring Boot】关系映射开发(三):多对多映射

《JPA 从入门到精通》系列包含以下文章&#xff1a; Java 持久层 API&#xff1a;JPA认识 JPA 的接口JPA 的查询方式基于 JPA 开发的文章管理系统&#xff08;CRUD&#xff09;关系映射开发&#xff08;一&#xff09;&#xff1a;一对一映射关系映射开发&#xff08;二&#…

打造未来商业生态:从方法论到实践

在当今快速变化的商业环境中&#xff0c;企业需要不断创新和适应&#xff0c;以保持竞争力并实现可持续发展。为了帮助企业在这个复杂的市场中找到方向并成功转型&#xff0c;我们将深入探讨一系列关键概念和策略&#xff0c;包括复盘、赋能、抓手、对标、沉淀、对齐、拉通、倒…

主线程结束子线程不再执行

问题背景&#xff1a; 起因是在做分布式锁的时候&#xff0c;我在单元测试里面创建了10个线程&#xff0c;然后启动。每个线程都会在run方法打印内容&#xff0c;但是测试结果居然什么都没输出。就很纳闷&#xff0c;然后推测可能是主线程执行完了子线程直接结束了&#xff0c…

香橙派AIpro做目标检测

使用香橙派AIpro做目标检测 文章目录 使用香橙派AIpro做目标检测香橙派AIpro开发板介绍香橙派AIpro应用体验快速体验香橙派的AI功能YOLOV5s目标检测使用场景描述图像目标检测视频目标检测摄像头目标检测YOLOv5s 目标检测的运行结果分析香橙派 AIpro 在运行过程中的表现 香橙派A…

git杂记

git 安装&#xff1a; 在 Windows 上安装 Git 也有几种安装方法。 官方版本可以在 Git 官方网站下载。 打开 https://git-scm.com/download/win&#xff0c;下载会自动开始。 要注意这是一个名为 Git for Windows 的项目&#xff08;也叫做 msysGit&#xff09;&#xff0c;和…

深入解析目标检测中的尺度变化问题及其解决方案

摘要 目标检测是计算机视觉领域的核心任务之一&#xff0c;旨在识别图像中的目标对象并确定其位置。尺度变化问题是目标检测中的一个关键挑战&#xff0c;它涉及目标在不同图像中的大小差异。本文将深入探讨尺度变化问题的原因、影响以及解决策略&#xff0c;并提供一些代码示…

dify-on-wechat中的entrypoint.sh脚本

注解&#xff1a;因为ntwork类库不支持Linux环境&#xff0c;所以企业微信就放弃了容器部署。 通过dockerfile启动容器&#xff1a; cd dify-on-wechat/docker # 进入docker目录 docker compose up -d # 启动docker容器 docker logs -f dify-on-wechat # 查…

XML Schema 属性

XML Schema 属性 XML Schema 是一种用于定义 XML 文档结构和内容的语言。它提供了一种强大的方式来描述 XML 文档中的元素、属性和数据类型。在 XML Schema 中,属性是用于提供有关元素的额外信息的标记,它们可以增强元素的功能和表达能力。本文将详细介绍 XML Schema 中的属…

基于Java+SpringMvc+Vue技术的实验室管理系统设计与实现

博主介绍&#xff1a;硕士研究生&#xff0c;专注于信息化技术领域开发与管理&#xff0c;会使用java、标准c/c等开发语言&#xff0c;以及毕业项目实战✌ 从事基于java BS架构、CS架构、c/c 编程工作近16年&#xff0c;拥有近12年的管理工作经验&#xff0c;拥有较丰富的技术架…