一文详解Java反射

文章目录

  • 反射是什么?
  • 反射的作用
  • 所有方法汇总
  • 一、加载Class对象
  • 二、加载类的构造器对象
  • 三、加载类的成员变量
  • 四、加载类的成员方法


反射是什么?

反射就是:加载类,并允许以编程的方式解剖类中的某个成分(成员变量,方法,构造器等)
反射需要学什么

  1. 反射第一步:加载类,获取类的字节码:Class对象
  2. 获取类的构造器:Constructor对象
  3. 获取类的成员变量:Field对象
  4. 获取类的成员方法:Method对象

在反射中,最重要的就是Class对象,之后的一切操作都是根据Class对象来操作的

反射的作用

  • 基本作用:可以得到一个类的全部成分然后操作

  • 可以破坏封装性

  • 适合做Java的框架,主流的框架会基于反射设计出一些通用的功能

一下测试代码我只提供了一个方法,需要源代码的在这里:反射代码

所有方法汇总

在这里插入图片描述

一、加载Class对象

获取Class对象的三种方法

  • Class c1 = 类名.class
  • 调用Class提供方法:public static Class forName(String Package);
  • Object提供的方法:public Class getClass(); Class c3 = 对象.getClass();
    /*** 测试三种方式得到的Class的三种方法* @throws ClassNotFoundException*/@Testpublic void testEquals() throws ClassNotFoundException {Class s1 = Class.forName("com.wk.reflect.Student");Class s2 = Student.class;Student student = new Student();Class s3 = student.getClass();System.out.println(s1 == s2);   //trueSystem.out.println(s2 == s3);   //trueSystem.out.println(s1 == s3);   //true}

二、加载类的构造器对象

加载构造器对象的步骤:

  • 获取类的Class对象
  • 调用方法获得构造器对象
  • 使用:创建一个对象实例newInstance()

获取构造器的方法如下

方法说明
Constructor<?>[] getConstructors()获取全部构造器(只能获取public修饰)
Constructor<?>[] getDeclaredConstructors()获取全部构造器(任意修饰都可以拿到)
Constructor getConstructor(Class<?>… parameterTypes)获取某个构造器(只能能获取public修饰)
Constructor getDeclaredConstructor(Class<?>… parameterTypes)获取某个构造器(任意修饰都可以拿到)
Constructor提供的方法说明
T newInstance(Object… initargs调用此构造器对象表示的构造器,并传入参数,完成对象的初始化并返回
public void setAccessible(boolean flag)设置为True,表示禁止加内存访问控制(暴力反射)
    @Testpublic void testAll() throws Exception {//获得一个Class对象Class<Student> s1 = Student.class;//获取一个构造器//这里将无参构造器设置为private的,但是这个也可以获取Constructor<Student> constructor = s1.getDeclaredConstructor();  //无参构造器是private的,所以需要暴力反射constructor.setAccessible(true);   Student stu = constructor.newInstance();System.out.println(stu);}
--------------输出---------------
无参构造器执行...
Student{age=0, name='null'}

三、加载类的成员变量

加载成员变量对象的步骤:

  • 获取类的Class对象
  • 调用方法获得成员变量对象
  • 使用:调用成员变量对象的get()/set()方法

获取构成员变量的方法如下

方法说明
public Field[] getFields()获取类的全部成员变量(只能获取public修饰的)
public Field[] getDeclaredFields()获取类的全部成员变量(任意修饰都可以拿到)
public Field getField(String name)获取类的某个成员变量(只能获取public修饰的)
public Field getDeclaredField(String name)获取类的某个成员变量(任意修饰都可以拿到)
方法说明
void set(Object obj, Object value);赋值
Object get(Object obj)取值
public void setAccessible(boolean flag)设置为true,表示禁止检查访问控制(暴力反射)
    @Testpublic void testAllField() throws Exception {Class<Student> student = Student.class;//单个时输入变量名Field age = student.getDeclaredField("age");Student student1 = new Student();age.setAccessible(true);age.set(student1,18);System.out.println(student1);}
------------输出--------------
无参构造器执行...
Student{age=18, name='null'}

四、加载类的成员方法

加载成员方法对象的步骤:

  • 获取类的Class对象
  • 调用方法获得成员方法对象
  • 使用:调用成员方法对象的invoke()方法
方法
Method[] getMethods()获取类的全部成员变量(只能获取public修饰的)
Method[] getDeclaredMethods()获取类的全部成员变量(任意修饰都可以拿到)
Method getMethod(String name, Class<?>… parameterTypes)获取类的某个成员变量(只能获取public修饰的)
Method getDeclaredMethod(String name, Class<?>… parameterTypes)获取类的某个成员变量(任意修饰都可以拿到)
Mehode提供的方法说明
public Object invoke(Object obj, Object… args)触发某个对象的该方法执行
public void setAccessible(boolean flag)设置为true,表示禁止检查访问控制(暴力反射)
    @Testpublic void testAllMethod() throws Exception {Class<Animal> animal = Animal.class;//参数为方法的名称Method declaredMethod = animal.getDeclaredMethod("eat");declaredMethod.setAccessible(true);Animal animal1 = new Animal();Object invoke = declaredMethod.invoke(animal1);//返回值为nullSystem.out.println(invoke);}
-----------输出--------------
动物吃
null

完结~

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

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

相关文章

实战:Docker Compose 下 Nginx、Java、Mysql 和 Redis 服务协同部署(包含解决浏览器访问Linux部署服务器本地资源问题)

1. 背景 在该实战中&#xff0c;我们将探讨如何使用Docker Compose协同部署Nginx、Java、Mysql和Redis服务&#xff0c;实现一个视频上传与展示的应用。具体需求如下&#xff1a; Java应用负责上传视频和图片资源到Nginx目录下&#xff0c;作为资源服务器。Nginx服务作为静态…

Numpy数组常用属性汇总(第5讲)

Numpy数组常用属性汇总 (第5讲)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ…

【JavaEE进阶】 Spring使用注解存储对象

文章目录 &#x1f334;序言&#x1f340;前置⼯作&#xff1a;配置扫描路径&#x1f384;添加注解存储 Bean 对象&#x1f333;类注解&#x1f6a9;为什么要这么多类注解&#x1f6a9;注解之间的联系 &#x1f38b;⽅法注解 Bean&#x1f6a9;⽅法注解需要配合类注解使⽤ ⭕总…

探索AIGC未来:CPU源码优化、多GPU编程与中国算力瓶颈与发展

★人工智能&#xff1b;大数据技术;AIGC;Turbo;DALLE 3;多模态大模型&#xff1b;MLLM&#xff1b;LLM&#xff1b;Agent&#xff1b;Llama2&#xff1b;国产GPU芯片&#xff1b;GPU;CPU&#xff1b;高性能计算机&#xff1b;边缘计算&#xff1b;大模型显存占用&#xff1b;5G…

如何夸张孩子

你刚才很努力啊&#xff01;——表扬努力尽管艰难&#xff0c;但你一直没有放弃——表扬耐心和坚持你做事情的态度非常不错——表扬态度你在_____上进步了很多&#xff01;——表扬细节这个方法真有新意&#xff01;——表扬创意你和小伙伴合作得真棒&#xff01;——表扬合作精…

中国特供阉割版 RTX 4090 曝光,老黄这操作绝了

到了现在大伙儿应该发现&#xff1a;国内禁售 NVIDIA RTX 4090 显卡这事儿基本实锤了。 实际上根据老美规定&#xff0c;从上个月 17 号开始&#xff0c;凡是公司主体在中国的显卡品牌&#xff0c;就已经不能生产和销售 RTX 4090。 以后厂商想要卖 4090 只能以整机形式出售&am…

艺术画廊展厅网站制作的效果如何

艺术展厅往往有很多人前往&#xff0c;在主要城市有不少画廊&#xff0c;对经营者来说&#xff0c;不同于销售行业&#xff0c;其更多的是打造品牌吸引用户前来或合作等形式&#xff0c;而由于行业特殊性&#xff0c;需要准属性用户才会前往。 因此在品牌打造及信息承载宣传方…

防止企业敏感数据泄露

敏感数据泄露是指意外或故意泄露关键信息&#xff0c;例如个人身份信息&#xff08;PII&#xff09;、支付卡信息&#xff08;PCI&#xff09;、受保护的电子健康信息&#xff08;ePHI&#xff09;和知识产权&#xff08;IP&#xff09;&#xff0c;数据保护措施不足的组织会在…

10-Hadoop组件开发技术

单选题 题目1&#xff1a;下列选项描述错误的是&#xff1f; 选项: A Hadoop HA即集群中包含Secondary NameNode作为备份节点存在。 B ResourceManager负责的是整个Yarn集群资源的监控、分配和管理工作 C NodeManager负责定时的向ResourceManager汇报所在节点的资源使用情况…

Spark---DataFrame存储、Spark UDF函数、UDAF函数

四、DataFrame存储Spark UDF函数 1、储存DataFrame 1&#xff09;、将DataFrame存储为parquet文件 2&#xff09;、将DataFrame存储到JDBC数据库 3&#xff09;、将DataFrame存储到Hive表 2、UDF&#xff1a;用户自定义函数 可以自定义类实现UDFX接口 java&#xff1a; …

案例062:基于微信小程序的健身房私教预约系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

模块式雨水调蓄池施工简单,无需大型机械,可实现当天开挖当天回填

模块式雨水调蓄池的施工过程非常简单&#xff0c;无需大型机械和繁琐的施工工艺。在施工过程中&#xff0c;只需要进行简单的开挖和回填即可&#xff0c;而且可以在当天完成。这种施工方式不仅节省了施工时间和成本&#xff0c;还可以避免因大型机械和繁琐工艺引起的安全隐患。…

MIT_线性代数笔记: 复习一

目录 问题一问题二问题三问题四 本讲为考前复习课&#xff0c;考试范围就是 Axb 这个单元&#xff0c;重点是长方形矩阵&#xff0c;与此相关的概念包括零空间、左零空间、秩、向量空间、子空间&#xff0c;特别是四个基本子空间。当矩阵为可逆的方阵时&#xff0c;很多性质是一…

二叉树的层次遍历

102. 二叉树的层序遍历 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 样例输入 示例 1&#xff1a; 输入&#xff1a;root [3…

php研究课题

对于PHP这门语言而言&#xff0c;可以研究的课题有很多&#xff0c;以下是可能的课题方向和对应的内容&#xff1a; PHP语言基础研究 PHP语言特性和基本语法PHP的数据类型、变量、运算符和表达式PHP的流程控制语句PHP的函数和引用PHP的面向对象编程和设计模式 PHP与Web开发 …

harmony开发之Text组件的使用

TextInput、TextArea是输入框组件&#xff0c;通常用于响应用户的输入操作&#xff0c;比如评论区的输入、聊天框的输入、表格的输入等&#xff0c;也可以结合其它组件构建功能页面&#xff0c;例如登录注册页面。 图片来源黑马程序员 Text组件的使用&#xff1a; 文本显示组…

flutter学习-day1-环境搭建和启动第一个项目

&#x1f4da; 目录 SDK 下载配置环境变量安装 flutter搭建 Android 环境SDK 和依赖升级IDE 配置与使用 Android Studio 配置与使用VS Code 配置与使用 真机调试 本文学习和引用自《Flutter实战第二版》&#xff1a;作者&#xff1a;杜文 1. SDK下载 前置需要操作系统 window …

Spring Cloud + Vue前后端分离-第4章 使用Vue cli 4搭建管理控台

Spring Cloud Vue前后端分离-第4章 使用Vue cli 4搭建管理控台 4-1 使用vue cli创建admin项目 Vue 简介 Vue作者尤雨溪在google工作时&#xff0c;最早只想研究angular的数据绑定功能&#xff0c;后面觉得这个小功能很好用&#xff0c;有前景&#xff0c;就再扩展&#xff…

[MySQL] MySQL复合查询(多表查询、子查询)

前面我们学习了MySQL简单的单表查询。但是我们发现&#xff0c;在很多情况下单表查询并不能很好的满足我们的查询需求。本篇文章会重点讲解MySQL中的多表查询、子查询和一些复杂查询。希望本篇文章会对你有所帮助。 文章目录 一、基本查询回顾 二、多表查询 2、1 笛卡尔积 2、2…

机器学习笔记 - 基于深度学习计算视频中演员的出镜时间

一、基本步骤 这里是使用动画片猫和老鼠进行计算,基本流程如下: 1、导入并读取视频,从中提取帧,并将其另存为图像 2、标记一些图像以训练模型(别担心,我已经为你做好了) 3、根据训练数据构建我们的模型 4、对剩余图像进行预测 5、计算汤姆和杰瑞的屏幕时间 二、基础环境…