JAVA反射基础篇

简介

Java反射是指在运行时动态地获取类的信息,并可以通过该信息来操作类或对象。通过反射,我们可以在运行时获取类的字段、方法、构造函数等信息,并能够动态地创建对象、调用方法、访问和修改字段的值。

一丶概念

反射是Java语言的一种机制,它允许程序在运行时检查和操作类、方法、字段等信息,而不需要提前知道它们的具体定义。通过反射,我们可以在运行时动态地加载类、创建对象、调用方法以及访问和修改字段。

Java反射提供了以下核心类:

  • Class类:代表Java中的类或接口。通过Class类,我们可以获取类的构造函数、方法、字段等信息。
  • Constructor类:代表类的构造函数。通过Constructor类,我们可以创建对象。
  • Method类:代表类的方法。通过Method类,我们可以调用方法。
  • Field类:代表类的字段。通过Field类,我们可以访问和修改字段的值。

二丶原理

Java反射的原理基于Java的运行时数据区域(Runtime Data Area)和类加载机制。当Java虚拟机加载一个类时,它将类的字节码文件加载到内存中,并在方法区创建一个Class对象来表示该类。Class对象包含了类的完整信息,包括类的构造函数、方法、字段等。

通过反射,我们可以通过Class对象来获取类的信息,并在运行时进行操作。反射提供了一系列的方法来获取Class对象、获取构造函数、获取方法、获取字段等。

三丶示例

public class ReflectionExample {public static void main(String[] args) throws Exception {// 获取Class对象Class<?> clazz = Class.forName("com.example.MyClass");// 创建对象Object object = clazz.newInstance();// 调用方法Method method = clazz.getDeclaredMethod("sayHello");method.invoke(object);// 访问字段Field field = clazz.getDeclaredField("message");field.setAccessible(true);field.set(object, "Hello, Reflection!");// 再次调用方法,输出修改后的字段值method.invoke(object);}
}class MyClass {private String message = "Hello, World!";public void sayHello() {System.out.println(message);}
}

在上述示例中,我们使用反射的方式创建了一个名为com.example.MyClass的类的对象,并调用了其中的sayHello方法。然后,我们通过反射访问了该类的私有字段message并修改了其值。最后,再次调用sayHello方法,输出修改后的字段值。

通过这个简单的示例,我们可以看到反射的强大之处。它允许我们在运行时动态地创建对象、调用方法以及访问和修改字段,而不需要提前知道类的具体定义。

四、应用场景

反射在Java中有许多应用场景,以下是一些常见的使用情况:

  • 框架和库:许多Java框架和库使用反射来实现动态加载和配置。例如,Spring框架使用反射来实现依赖注入和AOP编程。
  • 序列化和反序列化:Java的序列化和反序列化机制使用了反射。通过反射,可以在运行时动态地读取和写入对象的字段。
  • 单元测试:JUnit等单元测试框架使用反射来自动化执行测试用例。通过反射,测试框架可以自动发现和执行类中的测试方法。
  • 动态代理:Java动态代理机制利用了反射来实现代理对象的动态创建和方法调用的拦截。

五、注意事项

在使用反射时,我们需要注意以下几点:

  • 性能开销:反射的操作相比普通的Java代码会有一定的性能开销。因此,在性能要求较高的场景下,应尽量避免过度使用反射。
  • 访问权限:通过反射可以访问和修改类的私有成员,但这可能违反了类的封装性。在使用反射时,应注意尊重类的访问权限。
  • 异常处理:使用反射时,可能会抛出ClassNotFoundException、NoSuchMethodException等异常。在使用反射的代码中,要适当地处理这些异常。

总结

它允许程序在运行时动态地获取和操作类的信息。通过反射,我们可以创建对象、调用方法和访问字段,而不需要提前知道类的具体定义。

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

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

相关文章

2024.2.5力扣每日一题——跳跃游戏6

2024.2.5 题目来源我的题解方法一 深度搜索实现方法二 动态规划双端队列 题目来源 力扣每日一题&#xff1b;题序&#xff1a;1696 我的题解 方法一 深度搜索实现 使用深度搜索&#xff0c;每次选择一个在范围内的跳跃点&#xff0c;但是时间通不过。 时间复杂度&#xff1a…

Kafka配置与部署CentOS7[]

静态IP设置 # 修改网卡配置文件 vim /etc/sysconfig/network-scripts/ifcfg-ens33# 修改文件内容 TYPEEthernet PROXY_METHODnone BROWSER_ONLYno BOOTPROTOstatic IPADDR192.168.18.128 NETMASK255.255.255.0 GATEWAY192.168.18.2 DEFROUTEyes IPV4_FAILURE_FATALno IPV6INIT…

设计模式之解释器模式的魅力:让代码读懂你的语言

目录 一、什么是解释器模式 二、解释器模式的应用场景 三、解释器模式的优缺点 3.1. 优点 3.2. 缺点 四、解释器模式示例 4.1. 问题描述 4.2. 问题分析 4.3. 代码实现 4.4. 优化方向 五、总结 一、什么是解释器模式 解释器模式&#xff08;Interpreter pattern&…

kubernetes(K8S)学习(七):K8S之系统核心组件

K8S之系统核心组件 K8s系统核心组件1.1 Master和Node1.2 kubeadm1.3 先把核心组件总体过一遍1.4 Kubernetes源码查看方式1.5 kubectl1.6 API Server1.7 集群安全机制之API Server1.8 Scheduler1.9 kubelet1.10 kube-proxy K8s系统核心组件 1.1 Master和Node 官网 &#xff1a;…

360奇酷刷机 360刷机助手 QGDP360手机QGDP刷机

360奇酷刷机 360刷机助手 QGDP破解版360手机QGDP刷机 360手机刷机资源下载链接&#xff1a;360rom.github.io 参考&#xff1a;360手机-360刷机360刷机包twrp、root 360奇酷刷机&#xff1a;360高通驱动安装 360手机刷机驱动&#xff1b;手机内置&#xff0c;可通过USB文件传输…

搜索与图论——染色法判定二分图

一个图是二分图当且仅当这个图中不含奇数环 由于图中没有奇数环&#xff0c;所以染色过程中一定没有矛盾 所以一个二分图一定可以成功被二染色&#xff0c;反之在二染色的过程中出现矛盾的图中一定有奇数环&#xff0c;也就一定不是二分图 #include<iostream> #includ…

【c++初阶】类与对象(中)

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ &#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1…

2024.3.30力扣刷题记录-二叉树学习记录2(未完)

一、学习视频 如何灵活运用递归&#xff1f;【基础算法精讲 10】_哔哩哔哩_bilibili 二、跟练代码 1. 100. 相同的树 递归 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # …

Transformer论文阅读

Transformer论文阅读 摘要结论1 Introduction &#xff08;导言&#xff09;2 Background3 Model Architecture3.1 Encoder and Decoder StacksEncoderLayer NormDecoder 3.2 Attention3.2.1 Scaled Dot-Product Attention3.2.2 Scaled Dot-Product Attention3.2.3 Application…

4月1日起,未备案App小程序将下架

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 最后2天了、最后2天了。 从2024年4月1日起&#xff0c;工信部要求所有的APP、小程序都要备案&#xff0c;否则下架、关停、限制更新。这是去年8月份出的新规&#xff0c;没想到十个月这么快就过去了。 现在广东省…

【源码】关于支付宝和微信小程序的芝麻免押租赁平台建设

一、项目背景 随着科技的快速发展和互联网的普及&#xff0c;人们的生活方式发生了翻天覆地的变化。特别是在支付领域&#xff0c;传统的现金支付方式逐渐被电子支付所取代。支付宝和微信作为中国两大移动支付巨头&#xff0c;凭借其便捷、高效的特点&#xff0c;深受用户的喜…

深入解析大语言模型显存占用:训练与推理

深入解析大语言模型显存占用&#xff1a;训练与推理 文章脉络 估算模型保存大小 估算模型在训练时占用显存的大小 全量参数训练 PEFT训练 估算模型在推理时占用显存的大小 总结 对于NLP领域的从业者和研究人员来说&#xff0c;有没有遇到过这样一个场景&#xff0c;你的…

java 溯本求源之基础(九)之 javap

简介 Java 类文件反汇编工具&#xff08;javap&#xff09;是一个命令行工具&#xff0c;用于反汇编一个或多个 Java 类文件。反汇编的输出内容取决于使用的选项。当不使用任何选项时&#xff0c;javap 命令将打印传递给它的类的包、受保护的和公共字段以及方法。javap 命令将其…

某东推荐的十大3C热榜第一名!2024随身wifi靠谱品牌推荐!2024随身wifi怎么选?

一、鼠标金榜&#xff1a;戴尔 商务办公有线鼠标 售价:19.9&#xffe5; 50万人好评 二、平板电脑金榜&#xff1a;Apple iPod 10.2英寸 售价:2939&#xffe5; 200万人好评 三、随身WiFi金榜&#xff1a;格行随身WiFi 售价:69&#xffe5; 15万人好评 四、游戏本金榜&#xff…

C++多线程:unique_lock源码分析与使用详解(六)

1、unique_lock介绍 unique_lock取代lock_guard&#xff0c;unique_lock更像lock_guard的升级版&#xff0c;也是mutex的管家&#xff01; unique_lock是个类模板&#xff0c;工作中一般使用lock_guard&#xff08;推荐使用&#xff09; lock_guard取代了mutex的lock()和unloc…

Gromacs模拟一:配体-双链蛋白质复合物体系准备

1、蛋白质的准备&#xff1a; 在RCSB网站下载想要的蛋白晶体&#xff08;教程里是3htb&#xff09;&#xff0c;用notepad等编辑器或是分子可视化软件除去里面的非蛋白分子或离子。 这里采用的是一个经过分子对接后的蛋白质pdb和配体小分子的pdb。 教程里提到的配体是2-丙基…

【Java多线程】5——Lock底层原理

5 Lock底层原理 ⭐⭐⭐⭐⭐⭐ Github主页&#x1f449;https://github.com/A-BigTree 笔记仓库&#x1f449;https://github.com/A-BigTree/tree-learning-notes 个人主页&#x1f449;https://www.abigtree.top ⭐⭐⭐⭐⭐⭐ 如果可以&#xff0c;麻烦各位看官顺手点个star~&…

新能源汽车充电桩常见类型及充电桩站场的智能监管方案

随着新能源汽车市场的迅猛发展&#xff0c;充电桩作为支持其运行的基础设施&#xff0c;也呈现出多样化的类型。这些充电桩不仅在外形和功能上存在差异&#xff0c;更在充电速度、充电方式以及使用场景等方面展现出独特的优势。 一、充电桩类型及区别 1、慢充桩&#xff08;交…

C语言经典例题(14) --- 反斜线形图案、正斜线形图案、X形图案、空心正方形图案、空心三角形图案

1.反斜线形图案 题目描述: KK学习了循环&#xff0c;BoBo老师给他出了一系列打印图案的练习&#xff0c;该任务是打印用“*”组成的反斜线形图案。 输入描述: 多组输入&#xff0c;一个整数&#xff08;2~20&#xff09;&#xff0c;表示输出的行数&#xff0c;也表示组成反…

Go 之 Gin 框架

Gin 是一个 Go (Golang) 编写的轻量级 web 框架&#xff0c;运行速度非常快&#xff0c;擅长 Api 接口的高并发&#xff0c;如果项目的规模不大&#xff0c;业务相对简单&#xff0c;这个时候我们也推荐您使用 Gin&#xff0c;特别适合微服务框架。 简单路由配置 package mai…