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

news2024/12/26 10:25:30

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.coloradmin.cn/o/1905794.html

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

相关文章

shared_ptr 线程安全

为什么 shared_ptr 可以安全地在多个线程中共享&#xff1f; 循环引用 因为shared_ptr std::shared_ptr 的引用计数是线程安全的。这意味着你可以在多个线程中安全地拷贝、赋值和销毁 std::shared_ptr。然而&#xff0c;访问或修改 shared_ptr 所指向的对象时&#xff0c;需要…

SpringBoot彩蛋之定制启动画面

写在前面 在日常开发中&#xff0c;我们经常会看到各种各样的启动画面。例如以下几种 ① spring项目启动画面 ② mybatisplus启动画面 ③若依项目启动画面 还有很多各式各样好看的启动画面&#xff0c;那么怎么定制这些启动画面呢&#xff1f; 一、小试牛刀 ① 新建一个Spr…

聊聊数据库变更管控的白屏化

在前文中介绍了当涉及到数据库相关的变更如数据更新或者误删表等误操作时&#xff0c;通过延迟库或者闪回等功能来恢复业务&#xff0c;这些已经属于事后的故障处理了。当故障发生后&#xff0c;所要面临的是故障影响的不可控&#xff0c;所面临的损失也是不可预估的。就像最近…

【Excel】求和带文字的数据

目录标题 1. 给出样例2. CtrlE3. CtrlH → A替换为 → 全部替换 1. 给出样例 2. CtrlE 3. CtrlH → A替换为 → 全部替换

从零开始的python学习生活

pycharm部分好用快捷键 变量名的定义 与之前学习过的语言有所不同的是&#xff0c;python中变量名的定义更加的简洁 such as 整形。浮点型和字符串的定义 money50 haha13.14 gaga"hello"字符串的定义依然是需要加上引号&#xff0c;也不需要写&#xff1b;了 字符…

重温express

前言 很久之前囫囵吞枣的学过一点node&#xff0c;最近决定用nodevue写个博客项目&#xff0c;所以重新学习了express的相关内容。 初始搭建 创建项目 npm init给项目命名创建项目终端进入项目&#xff0c;安装express依赖&#xff0c;npm i expressjs文件中引入express使用…

「C++系列」C++ 常量知识点-细致讲解

文章目录 一、C 常量定义1. 使用#define预处理指令2. 使用const关键字3. 局部常量4. 全局常量5. 指针常量6. 枚举&#xff08;Enumerations&#xff09;7. constexpr&#xff08;C11及以后&#xff09; 二、C 整数常量1. 十进制整数常量2. 八进制整数常量3. 十六进制整数常量4.…

RAG理论:ES混合搜索BM25+kNN(cosine)以及归一化

接前一篇:RAG实践:ES混合搜索BM25+kNN(cosine) https://blog.csdn.net/Xin_101/article/details/140230948 本文主要讲解混合搜索相关理论以及计算推导过程, 包括BM25、kNN以及ES中使用混合搜索分数计算过程。 详细讲解: (1)ES中如何通过BM25计算关键词搜索分数; (2)…

Postman使用指南①网页版使用

postman官网地址&#xff1a;Postman API Platform 进入后点击右上角免费注册&#xff0c;注册后登录 登录之后即可在网页使用&#xff0c;无需下载

static的理论学习

在说到static之前&#xff0c;需要先明确变量类型&#xff1a; 而在聊到变量类型之前我们可以将变量的两个属性好好学一学 变量的两个属性 作用域&#xff08;scope&#xff09;&#xff1a; 从内存的角度来看&#xff0c;就是变量存放在栈&#xff08;stack&#xff09;中&…

最新版Python安装教程

一、安装Python 1.下载Python 访问Python官网&#xff1a; https:/www.oython.orgl 点击downloads按钮&#xff0c;在下拉框中选择系统类型(windows/Mac OS./Linux等) 选择下载最新稳定版本的Python 以下内容以演示安装Windows操作系统64位的python 左边是稳定发布版本Stabl…

6000字以上论文参考:基于Java+SpringMvc+Vue技术的实验室管理系统设计与实现

可参考&#xff1a;基于JavaSpringMvcVue技术的实验室管理系统设计与实现&#xff08;6000字以上论文参考&#xff09;-CSDN博客 论文参考&#xff1a;

算法day03 桶排序 数据结构分类 时间复杂度 异或运算

学数据结构之前 必看_哔哩哔哩_bilibili 1.认识复杂度和简单排序算法_哔哩哔哩_bilibili 桶排序&#xff08;Bucket sort&#xff09;------时间复杂度为O(n)的排序方法&#xff08;一&#xff09;_多桶排序时间复杂度-CSDN博客 桶排序 测试场景&#xff1a;数组中有10000个随…

【Excel】输入内容自动添加边框线

1. 选中表格区域 → 新建条件规则 2. 设置公式 3. 设置格式 测试生效

[激光原理与应用-100]:南京科耐激光-激光焊接-焊中检测-智能制程监测系统IPM介绍 - 4 - 3C电池行业应用 - 不同的电池类型、焊接方式类型

目录 前言&#xff1a; 一、激光在3C行业的应用概述 1.1 概述 1.2 激光焊接在3C-电池行业的应用 1.3 动力电池的激光焊接工艺 1.3.1 概述 1.3.2 动力电池常见的焊接应用 1.电池壳体与盖板焊接 2.电池防爆阀密封 焊接 二、不同的电池的外形 2.1 软包锂电池 2.1.1 概述…

数字传输系统的演变与应用

引言 在现代通信网络中&#xff0c;数字传输系统扮演着至关重要的角色。本文将用简单易懂的语言&#xff0c;向初学者介绍PCM速率体制、SONET/SDH以及光网络&#xff0c;让大家更好地理解这些技术。 2.5.1 PCM速率体制 数字传输系统简介 在早期电话网络中&#xff0c;用户电话…

基于S32K144驱动NSD8381

文章目录 1.前言2.芯片介绍2.1 芯片简介2.2 硬件特性2.3 软件特性 3.测试环境3.1 工具3.2 架构 4.软件驱动4.1 SPI4.2 CTRL引脚4.3 寄存器4.4 双极性步进电机驱动流程 5.测试情况6.参考资料 1.前言 最近有些做电磁阀和调光大灯的客户需要寻找国产的双极性步进电机驱动&#xf…

qemu模拟orangepi

前言 由于qemu目前只支持orange pipc单板&#xff0c;也就是H3型号&#xff0c;故我们就拿这个型号做测试 环境搭建 linux主机环境 我这里采用win10 WSL&#xff0c;且环境用的是openeuler的&#xff0c;在选择服务器类型可以按照自己喜好选择&#xff0c;也就是包安装方式…

玉石风能否接棒黏土风?一探AI绘画新风尚

在数字艺术的浪潮中,AI绘画平台以其独特的创造力和便捷性,正在逐步改变我们对艺术的传统认知。从黏土风的温暖质感到琉璃玉石的细腻光泽,每一次风格的转变都引领着新的潮流。今天,我们将聚焦玉石风,探讨它是否能成为下一个流行的艺术滤镜,并提供一种在线体验的方式,让你…

SUSAN

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