java反射机制原理、获取Class方式和其应用场景

1、反射是什么:

        反射是一种动态地获取和操作类信息的行为。类信息包括类的属性、方法、构造函数等。

        类信息在Java中通常存储在.class文件中。当我们编写Java代码并进行编译时,编译器(javac)将源代码转换为字节码,并将字节码保存在.class文件中。

         在运行时,当我们使用反射来获取类的信息时,实际上是通过读取和解析.class文件来获取类的结构信息。反射机制允许我们在运行时动态地加载和操作类的信息,而不需要在编译时明确知道类的类型。

2、 获取Class对象以及其对其操作:

  获取class对象(三种方式对应三个阶段)

 反射代码简单示例:

public class ReflexDemo {public static void main(String[] args) throws Exception{Class<person> clazz = person.class;//通过newInstance()创建对象person person = clazz.newInstance();//获取方法名为getName的方法Method changeName = clazz.getMethod("changeName", String.class);//调用了person对象的chanName方法changeName.invoke(person, "wkx");}
}class person {private String name;Person(){}Person(String name){this.name = name;}public void changeName(String name){this.name =name;System.out.println("我将名字改为了"+name);}
}

 3、操作Class对象的API

  • 变量信息:Filed
  • 成员方法:Method
  • 构造器:Constructor
  • 注解信息:Annotation
  • 权限修饰符:Modifier

创建类的实例的方式:

//创建类的实例:可以使用以下方法创建类的实例:Person person1 = clazz.newInstance();// 调用无参构造方法创建实例Constructor<Person> declaredConstructor = clazz.getDeclaredConstructor(String.class);// 获取指定构造方法,第二个参数为构造方法参数类型Person person2 = declaredConstructor.newInstance("小明");// 调用构造方法创建实例,args为构造方法参数的值

对于类的字段信息的操作:

//获取类的字段信息:可以使用以下方法获取类的字段信息:    
Field[] fields1 = clazz.getFields();// 获取所有字段,不包括私有字段
Field[] fields = clazz.getDeclaredFields(); // 获取所有字段,包括私有字段
Field field = clazz.getDeclaredField("name"); // 获取指定字段//对于修饰符为private的变量,,不能直接通过反射对其赋值取值,要进行暴力反射
field.setAccessible(true); // 如果字段是私有的,需要设置可访问性
field.set(person1, "wuing"); // 修改字段值,person1为字段所属对象,value为新的字段值

获取类的方法信息并对其进行调用的操作:

//获取类的方法信息:可以使用以下方法获取类的方法信息Method[] methods1 = clazz.getMethods();// 获取所有方法, 不包括私有方法Method[] methods = clazz.getDeclaredMethods(); // 获取所有方法,包括私有方法Method method = clazz.getDeclaredMethod("changeName", String.class); // 获取指定方法,第二个为方法参数类型的Object result = method.invoke(person1, "wkx"); // 调用方法,instance为方法所属对象,args为方法参数的值
//如果调用的方法的修饰词为private,就也要暴力反射,.setAccessible(true);

4、java反射用于场景

  1. 插件系统:通过使用反射,可以在应用程序中实现插件系统。应用程序可以在运行时加载和卸载插件,通过反射调用插件中定义的方法,实现动态扩展功能。

  2. 配置文件解析:反射可以用于解析配置文件,例如XML或JSON文件。通过反射,可以动态地读取配置文件中的类名、字段和方法,并在运行时创建相应的对象。

  3. 单元测试:在单元测试中,反射可以用于访问私有方法和字段,以便进行更全面的测试。通过反射,可以绕过访问修饰符的限制,调用私有方法或设置私有字段的值。

  4. 动态代理:反射可以用于实现动态代理。通过反射,可以在运行时创建代理对象,并在代理对象的方法调用前后执行额外的逻辑,例如日志记录、性能监控等。

  5. 框架开发:许多框架(如Spring)使用反射来实现依赖注入、AOP(面向切面编程)等功能。通过反射,框架可以在运行时动态地创建对象、调用方法,并实现解耦和灵活性

        需要注意的是,虽然反射提供了一种强大的机制来操作类的成员,但过度使用反射可能会导致性能下降和代码可读性降低。因此,在使用反射时应谨慎考虑其适用性和性能影响。

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

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

相关文章

Mapper层公共字段自动填充

公共字段自动填充 问题分析 我们在进行一些新增修改操作时&#xff0c;我们需要设置创建时间、创建人、修改时间、修改人等字段。 这些字段属于公共字段&#xff0c;也就是也就是在我们的系统中很多表中都会有这些字段&#xff0c;如下&#xff1a; 序号字段名含义数据类型1c…

【分布式流控组件 Sentinel 快速入门】——图文详解操作流程

&#x1f4a7; 分布式流控组件 S e n t i n e l 快速入门 \color{#FF1493}{分布式流控组件 Sentinel 快速入门} 分布式流控组件Sentinel快速入门&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨ &#x1f984; 个人主页——微风撞见云的博客&#…

智慧工地云平台源码,基于微服务+Java+Spring Cloud +UniApp +MySql开发

智慧工地可视化系统利用物联网、人工智能、云计算、大数据、移动互联网等新一代信息技术&#xff0c;通过工地中台、三维建模服务、视频AI分析服务等技术支撑&#xff0c;实现智慧工地高精度动态仿真&#xff0c;趋势分析、预测、模拟&#xff0c;建设智能化、标准化的智慧工地…

华为云交付

文章目录 一、华为云-公有云架构华为公有云的主要服务1.华为云服务—计算类2.华为云服务——存储类3.华为云服务—网络类4.华为云服务—管理和监督类5.华为云数据库 二、待续 一、华为云-公有云架构 华为公有云的主要服务 ECS&#xff1a;弹性云服务器&#xff08; Elastic Cl…

穷举深搜暴搜回溯剪枝(3)

一)字母大小写全排列 784. 字母大小写全排列 - 力扣&#xff08;LeetCode&#xff09; 1)从每一个字符开始进行枚举&#xff0c;如果枚举的是一个数字字符&#xff0c;直接忽视 如果是字母的话&#xff0c;进行选择是变还是不变 2)当进行遍历到叶子结点的时候&#xff0c;直接将…

(三)Node.js - 模块化

1. Node.js中的模块化 Node.js中根据模块来源不同&#xff0c;将模块分为了3大类&#xff0c;分别是&#xff1a; 内置模块&#xff1a;内置模块由Node.js官方提供的&#xff0c;例如fs、path、http等自定义模块&#xff1a;用户创建的每个.js文件&#xff0c;都是自定义模块…

jmeter 5.1彻底解决中文上传乱码

1.修改源码,然后重新打jar包,就是所有上传文件名重新获取文件名 参考链接:多种Jmeter中文乱码问题处理方法 - 51Testing软件测试网 2.修改Advanced,必须选java

RaabitMQ(三) - RabbitMQ队列类型、死信消息与死信队列、懒队列、集群模式、MQ常见消息问题

RabbitMQ队列类型 Classic经典队列 这是RabbitMQ最为经典的队列类型。在单机环境中&#xff0c;拥有比较高的消息可靠性。 经典队列可以选择是否持久化(Durability)以及是否自动删除(Auto delete)两个属性。 Durability有两个选项&#xff0c;Durable和Transient。 Durable表…

【ARM Coresight 系列文章 2.5 - Coresight 寄存器:PIDR0-PIDR7,CIDR0-CIDR3 介绍】

文章目录 1.1 JEDEC 与 JEP1061.2 PIDR0-PIDR7(peripheral identification registers)1.2 CIDR0-CIDR3(Component Identification Registers) 1.1 JEDEC 与 JEP106 JEDEC和JEP106都是来自美国电子工业联合会&#xff08;JEDEC&#xff0c;Joint Electron Device Engineering C…

深度学习(34)—— StarGAN(1)

深度学习&#xff08;34&#xff09;—— StarGAN&#xff08;1&#xff09; 文章目录 深度学习&#xff08;34&#xff09;—— StarGAN&#xff08;1&#xff09;1. 背景2. 基本思路3. 整体流程4. StarGAN v2(1) 网络结构(2) mapping network(3) style encoder(4)Loss 和之前…

4个顶级的支持消费级硬件的NeRF软件平台

似乎每天都有大量的创新发布&#xff0c;人们很容易感到不知所措。因此&#xff0c;让我们放慢脚步&#xff0c;看看4个主流的支持消费级硬件的NeRF 平台。 推荐&#xff1a;用 NSDT设计器 快速搭建可编程3D场景。 1、Instant-NGP&#xff08;Instant-NeRF&#xff09; 2022 年…

计算机网络-三种交换方式

计算机网络-三种交换方式 电路交换(Circuit Switching) 电话交换机接通电话线的方式称为电路交换从通信资源分配的角度来看&#xff0c;交换(Switching)就是按照某种方式动态的分配传输线路的资源 电话交换机 为了解决电话之间通信两两之间连线过多&#xff0c;所以产生了电话…

认识 spring AOP (面向切面编程) - springboot

前言 本篇介绍什么是spring AOP, AOP的优点&#xff0c;使用场景&#xff0c;spring AOP的组成&#xff0c;简单实现AOP 并 了解它的通知&#xff1b;如有错误&#xff0c;请在评论区指正&#xff0c;让我们一起交流&#xff0c;共同进步&#xff01; 文章目录 前言1. 什么是s…

快速制作美容行业预约小程序

随着科技的不断进步&#xff0c;移动互联网的快速发展&#xff0c;小程序成为了很多行业迅速发展的利器。对于美容行业来说&#xff0c;一款美容预约小程序不仅可以方便用户进行预约&#xff0c;还可以提升美容店铺的服务质量和管理效率。下面&#xff0c;我们来介绍一下如何快…

【云原生K8s】初识Kubernetes的理论基础

K8S由google的Borg系统(博格系统&#xff0c;google内部使用的大规模容器编排工具)作为原型&#xff0c;后经GO语言延用Borg的思路重写并捐献给CNCF基金会开源。 云原生基金会&#xff08;CNCF&#xff09;于2015年12月成立&#xff0c;隶属于Linux基金会。CNCF孵化的第一个项目…

iOS——Block循环引用

Capturing ‘self’ strongly in this block is likely to lead to a retain cycle 典型的循环引用 self持有了blockblock持有了self(self.name) 这样就形成了self -> block -> self的循环引用 解决办法 强弱共舞 使用 中介者模式 __weak typeof(self) weakSelf sel…

【Spring Boot】(二)Spring Boot 配置文件的探索之旅

文章目录 前言一、配置文件的作用二、配置文件的格式2.1 Spring Boot 配置文件格式2.2 properties 和 yml 的区别 三、properties 配置文件3.1 properties 基本语法3.2 配置文件的读取3.3 properties 优缺点分析 四、yml 配置文件说明4.1 yml 基本语法4.2 yml 使用案例4.3 yml …

fishing之第四篇使用案例一模拟登陆口

文章目录 一、访问钓鱼平台二、Sending Profiles(发件人邮箱配置)三、User&Groups(接收人邮件列表)四、Landing Pags(钓鱼页面配置)五、Email Templates(邮件内容配置)六、Campaigns七、攻击结果查看免责声明一、访问钓鱼平台 详细查看第二篇的gophish的搭建 二…

WebRTC 之音视频同步

在网络视频会议中&#xff0c; 我们常会遇到音视频不同步的问题&#xff0c; 我们有一个专有名词 lip-sync 唇同步来描述这类问题&#xff0c;当我们看到人的嘴唇动作与听到的声音对不上的时候&#xff0c;不同步的问题就出现了 而在线会议中&#xff0c; 听见清晰的声音是优先…

Java窗体应用程序人事管理系统web人资招聘员工劳资jsp源代码mysql

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 Java窗体应用程序人事管理系统 注意&#xff1a;此项…