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;或应用皮肤…

扩散模型笔记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…

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

第一单元 走进化学世界 一 物质的变化和性质 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;二&#…

香橙派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;和…

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

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

SUSAN

1995年英国牛津大学的S.M.Smith提出了一种新的图像边缘检测算法SUSAN算法,不同于以前经典边缘检测算法,SUSAN算法基于灰度相似性比较,采用圆形模板,对图像进行灰度差统计,无需计算方向导数,而且具备积分特性,它简单而且有效,适用于图像中边缘和角点的检测,可以去除图像…

土豆炒肉做法

菜单&#xff1a;土豆、葱、铁辣子、纯瘦肉、淀粉、生抽、酱油、刀、案板、十三香、盐巴、擦板 流程&#xff1a; 洗土豆&#xff0c;削皮&#xff0c;擦成条&#xff0c;用凉水过滤两遍淀粉&#xff0c;顺便放个燥里洗肉&#xff0c;切成条&#xff0c;按照生抽、酱油、淀粉、…

js好用的动态分页插件

js好用的动态分页插件是一款简单的分页样式插件&#xff0c;支持样式类型&#xff0c;当前页&#xff0c;每页显示数量&#xff0c;按钮数量&#xff0c;总条数&#xff0c;上一页文字&#xff0c;下一页文字&#xff0c;输入框跳转等功能。 js好用的动态分页插件

通过IDEA生成webapp及web.xml配置文件

1、选择File->Project Structure 2、选择Modules-> + -> Web 有的springboot工程选择是war工程,这个web可能已经存在了。 如果不存在,就手动创建,创建后,需要修改pom.xml中的配置 <packaging>war</packaging> 3、创建webapp根目录 这步重点就是创建…

介绍一款Java开发的商业开源MES系统

介绍一款Java开发的开源MES系统&#xff0c;万界星空科技开源的MES系统。该系统基于Java开发&#xff0c;具有广泛的适用性和高度的可定制性&#xff0c;能够满足不同行业、不同规模企业的智能制造需求。 一、系统概述 万界星空科技开源的MES系统是一款面向制造企业车间执行层…

昇思25天学习打卡营第19天 | CycleGAN图像风格迁移互换

内容介绍&#xff1a; CycleGAN(Cycle Generative Adversarial Network) 即循环对抗生成网络&#xff0c;该模型实现了一种在没有配对示例的情况下学习将图像从源域 X 转换到目标域 Y 的方法。 该模型一个重要应用领域是域迁移(Domain Adaptation)&#xff0c;可以通俗地理解…

Java中获取Class对象的三种方式

Java中获取Class对象的三种方式 1、对象调用getClass()方法2、类名.class的方式3、通过Class.forName()静态方法4、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Java中&#xff0c;Class对象是一个非常重要的概念&#xff0c;它代…