Java反射的使用

反射是Java框架的核心,无论是Tomcat,SpringMVC,SpringIOC,SpringAOP,动态代理,都使用了反射

那么什么是反射?-------------反射就是获取类信息的能力

Java有两种创建对象的方式:①new 对象  ②反射

因此,反射的作用就是,无需new对象,就可以动态获取到一个类的全部信息,包括属性,方法,构造器,以及他们的修饰符,参数,注解等等....从而构造出对象实例并对对象实例进行操作

一、获取类信息

1、获取class对象

  • Class.forName("全类名") ----- 在 java文件阶段 就可以获取 字节码文件对象,因此这是最常用的(这种是最常用的)
  • 类名.class ------ 要在类加载完成阶段才能获取
  • 对象名.getClass() -------- 要在对象已经被创建出来的阶段才能获取
        //第一种Class clazz = Class.forName("fanshe.person");//第二种Class clazz1 = person.class;//第三种person person = new person();Class clazz2 = person.getClass();

2、获取变量

Filed[] fileds = clazz.getDeclaredFileds();  //获取全部的变量
Filed[] fileds = clazz.getFileds();  //获取public修饰的变量
Filed filed = clazz.getFiled("变量名"); //获取指定的public修饰的变量
Filed filed = clazz.getDeclaredFiled(变量名"); //获取指定的的变量

3、获取方法

Method[ ] methods = clazz.getDeclaredMethods(); //获取全部的方法
Method[ ] methods = clazz.getMethods();  //获取全部public修饰的方法
Method method = clazz.getMethod("方法名",参数类型.class,参数类型.class...; //单独获取public修饰的方法
Method method = clazz.getDeclaredMethod("方法名",参数类型.class,参数类型.class...); //单独获取方法

4、获取构造器

Constructor[] constructors = clazz.getDeclaredConstructors(); //获取所有的构造器
Constructor[] constructors = clazz.getConstructors(); //获取public修饰的构造器
Constructor constructor = clazz.getConstructor(参数类型.class,参数类型.class..; //单独获取public修饰的构造器
Constructor constructor = clazz.getDeclaredConstructor(参数类型.class ,参数类型.class….;//单独获取构造器

5、获取注解信息

 Annotation[] annotations = clazz.getAnnotations();

二、如何操作变量

下面看一段代码示例

        Class clazz = Class.forName("fanshe.person");System.out.println("----------获取 修改值--------------");//要想获取到值,必须先创建对象,给数据存储空间person p = new person(); Field age = clazz.getDeclaredField("age");//get() set()取值和赋值int ageValue = (int) age.get(p);//类型转换System.out.println(ageValue);age.set(p, 20);int ageValue1 = (int) age.get(p);System.out.println(ageValue1);Field height = clazz.getDeclaredField("height");//私有数据需要使用暴力反射height.setAccessible(true);//暴力反射height.set(p, 180);System.out.println(height.get(p));//只有private类型需要使用暴力反射Field name = clazz.getDeclaredField("name");name.set(p, "张三");System.out.println(name.get(p));Field eyes = clazz.getDeclaredField("eyes");eyes.set(p, 2);System.out.println(eyes.get(p));

需要注意的是,

如果该属性或方法类型为private,那么需要使用暴力反射,也就是 属性.setAccessible(true)

如果要获取private类型的方法,那么需要使用getDeclared*****

三、调用方法

方法.invoke(对象,"参数");

        clazz = Class.forName("fanshe.person");Method run = clazz.getDeclaredMethod("run", String.class);//创建对象,给方法以内存空间person p1 = new person();//invoke()执行方法run.invoke(p1, "张三");Method change = clazz.getDeclaredMethod("change",String.class,Integer.class);change.invoke(p1,"小白",183);Method age = clazz.getDeclaredMethod("getAge", Integer.class);//暴力反射age.setAccessible(true);age.invoke(p1, 18);

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

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

相关文章

Linux内核的块设备抽象层

Linux内核的块设备抽象层是指块设备框架的核心组件,它负责处理块设备I/O请求,向上层提交完成请求的通知,并提供一些与块设备相关的函数,包括对块设备进行初始化、打开、关闭等操作。 在块设备抽象层中,最基本的结构体…

ffmpeg剪切视频的一些优化(或者说是一些坑)

问题描述 最近我们在做一个项目,这个项目需要使用到ffmpeg这个工具来对视频进行剪切,也就是剪出一个视频中的某一段,在实际测试中,我们发现,ffmpeg剪切速度很慢,而且这个速度还与剪切点开始时间&#xff0…

ThreadPoolExecutor自定义线程池|拒绝策略|线程工厂|统一捕获异常

线程池的7大参数含义介绍 corePoolSize:池中一直保持的线程的数量。 maximumPoolSize:池中允许的最大的线程数。 keepAliveTime:当线程数大于核心线程数的时候,线程在最大多长时间没有接到新任务就会终止释放, 最终…

数据结构--栈和队列

part 1. 栈 栈是一种后进先出的结构。 常用操作: (1)清空(clear) (2)获取栈内元素个数(size) (3)判空(empty) &…

Python 集合 union()函数使用详解,Python合并集合

「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」:小白零基础《Python入门到精通》 union函数使用详解 1、合并多个集合2、合并其他类型2.1、合并字符串2.2、合并列表…

Linux超详细的了解

文章目录 前言Linux的简介不同应用领域的主流操作系统Linux系统历史Linux系统各版本 Linux的安装安装方式介绍安装Linux网卡设置安装SSH连接工具finalShell连接虚拟机Linux和Windows目录结构对比Linux目录介绍 Linux常用命令Linux命令初体验文件目录命令ls命令cd命令cat命令mor…

Hbase基本原理剖析

一、基本原理 数据存储使用HBase来承接,HBase是一个开源的、面向列(Column-Oriented)、适合存储海量非结构化数据或半结构化数据的、具备高可靠性、高性能、可灵活扩展伸缩的、支持实时数据读写的分布式存储系统。更多关于HBase的信息&#…

html 解决css样式 缓存 ---css引入添加时间戳

通过js 对引入的css添加时间戳 <script type"text/javascript">document.write("<link relstylesheet typetext/css href./style/base.css?v" new Date().getTime() ">");document.write("<link relstylesheet typetext…

面试:浏览器常见问题-优化与兼容

前端开发浏览器优化方案有哪些&#xff1f; 以下是一些前端开发中常用的浏览器优化方案&#xff1a; 减少HTTP请求数量&#xff1a;将多个CSS和JavaScript文件合并为一个文件&#xff0c;使用CSS sprites来减少图片请求数量&#xff0c;使用字体图标替代小图标等&#xff0c;可…

IDEA: 将第三方依赖打入jar包

文章目录 一、添加自定义的jar包到lib目录下二、将自定义依赖包打入jar包方式1、使用springboot自带的插件 一、添加自定义的jar包到lib目录下 参考往期文章&#xff1a;IDEA中Java项目创建lib目录(添加依赖jar包代替maven依赖) 二、将自定义依赖包打入jar包 方式1、使用spr…

antd React--如何修改Modal弹出位置

<Modaltitle"人员基本信息配置"visible{personBaseInfoModalVisible}onCancel{handlePersonBaseInfoClose}width{800}footer{[<EButton title{"关闭"} onClick{handlePersonBaseInfoClose}/>]}style{{top: "10px" //调整浮层位置}} >…

windows系统安装异构虚拟机arm版的银河麒麟服务器

下载qemu UEFI&#xff08;BIOS的替代方案&#xff09;的下载地址&#xff1a;http://releases.linaro.org/components/kernel/uefi-linaro/16.02/release/qemu64/QEMU_EFI.fd QEMU 软件的下载地址&#xff1a;https://qemu.weilnetz.de/w64/2021/qemu-w64-setup-20210505.exe …

Sentinel规则持久化到nacos的实现(源码修改)

文章目录 1、Sentinel源码修改2、持久化效果测试 Sentinel规则管理有三种模式&#xff1a; 原始模式pull模式push模式 这是实现push方式&#xff1a; push模式即控制台将配置规则推送到远程配置中心&#xff0c;例如Nacos。Sentinel客户端去监听Nacos&#xff0c;获取配置变更…

低代码如何帮助企业数字化转型?

在数字化时代背景下&#xff0c;企业都面临着巨大的数字化转型挑战。为了迎接这一挑战&#xff0c;企业软件开发工具和平台都在不断地创新和进化。其中&#xff0c;低代码开发平台应运而生&#xff0c;并成为了众多企业转型的首选方案。企业为什么都选择低代码开发平台&#xf…

一键批量JSON标注转PNG图片工具V1.1,支持labelme快捷矩形、圆以及轮廓标注

上次发布了一个批量将labelme标注的json文件转换为png文件工具&#xff0c;但是当时只是想着自己用的&#xff0c;功能相当简单&#xff0c;一些网友使用之后跟我反馈这玩意真”垃圾“&#xff0c;很多情况都没有进行设想&#xff0c;所以在功能上很欠缺。由于小陶这几天在外地…

pytorch工具——使用pytorch构建一个神经网络

目录 构建模型模型中的可训练参数假设输入尺寸为32*32损失函数反向传播更新网络参数 构建模型 import torch import torch.nn as nn import torch.nn.functional as Fclass Net(nn.Module):def __init__(self):super(Net,self).__init__()#定义第一层卷积层&#xff0c;输入维…

【C++杂货铺】运算符重载

目录 前言一、运算符重载二、赋值运算符重载三、完善日期类3.1 重载关系运算符3.2 重载、3.3 重载-、-3.4 重载、--3.5 重载<<、>> 四、const成员五、取地址及const取地址操作符重载 前言 本文将以日期类为基础&#xff0c;去探寻运算符重载的特性与使用方法&…

Burp Suite---渗透测试工具

文章目录 Burp SuiteBurp Suite入门设置代理HTTP的代理 Proxy&#xff08;代理&#xff09; Burp Suite 是一款集成化的渗透测试工具&#xff0c;包含了很多功能&#xff0c;可以帮助我们高效地完成对Web应用程序的渗透测试和攻击。 Burp Suite由Java语言编写&#xff0c;基于…

【Docker】Docker的数据管理

目录 一、Docker 的数据管理1.1数据卷1.2 数据卷容器1.3端口映射1.4容器互联&#xff08;使用centos镜像&#xff09; 二、Docker镜像的创建2.1基于现有镜像创建2.2&#xff0e;基于本地模板创建2.3 基于Dockerfile 创建联合文件系统&#xff08;UnionFS&#xff09;镜像加载原…

【Vue3】Vue3核心内容(上)

&#x1f380;个人主页&#xff1a;努力学习前端知识的小羊 感谢你们的支持&#xff1a;收藏&#x1f384; 点赞&#x1f36c; 加关注&#x1fa90; 文章目录 常用的Composition APIsetup函数ref函数reactive函数vue3中的响应式原理vue2的响应式Vue3的响应式 reactive对比Refse…