一文详解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.hqwc.cn/news/258067.html

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

相关文章

windows系统nodeJs报错node-sass npm ERR! command failed

报错信息 npm WARN deprecated request2.88.2: request has been deprecated, see https://github.com/request/request/issues/3142 npm WARN deprecated tar2.2.2: This version of tar is no longer supported, and will not receive security updates. Please upgrade asa…

数组的查找:线性查找,二分查找

数组的查找&#xff1a;线性查找&#xff0c;二分查找 主要包含线性查找、二分查找 线性查找 先复习一下数组&#xff1a;数据结构复习&#xff1a;链表、数组、栈、队列、哈希表、堆、二叉树-CSDN博客 即便数据没有按顺序存储,也可以应用线性查找。 查找数字&#xff1a;首…

Apache Flink(四):Flink 其他实时计算框架对比

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 根据前文描述我们知道Flink主要处…

【flink番外篇】1、flink的23种常用算子介绍及详细示例(1)- map、flatmap和filter

Flink 系列文章 一、Flink 专栏 Flink 专栏系统介绍某一知识点&#xff0c;并辅以具体的示例进行说明。 1、Flink 部署系列 本部分介绍Flink的部署、配置相关基础内容。 2、Flink基础系列 本部分介绍Flink 的基础部分&#xff0c;比如术语、架构、编程模型、编程指南、基本的…

【优选算法系列】【专题二滑动窗口】第三节.904. 水果成篮和438. 找到字符串中所有字母异位词

文章目录 前言一、水果成篮 1.1 题目描述 1.2 题目解析 1.2.1 算法原理 1.2.2 代码编写 1.2.3 题目总结二、找到字符串中所有字母异位词 2.1 题目描述 2.2 题目解析 2.2.1 算法原理 2.2.2 代码编写 …

HarmonyOS学习 第2节 DevEco Studio工程介绍

工程配置页 界面布局介绍 代码编辑区、通知栏、工程目录区、预览区 工程目录区 便于理解&#xff0c;可以切换为 Ohos AppScope主要用于存放整个应用公共的信息与资源 entry默认的初始模块ets文件用于存放编写的代码文件configuration存放相应模块的配置文件resources对应模块…

Cheat Engine修改器检测方案

在游戏安全对抗过程中&#xff0c;有不少外挂的实现基于对游戏内存模块进行修改&#xff0c;这类外挂通常会使用「内存修改器」。 据FairGuard游戏安全数据统计&#xff0c;在游戏面临的众多安全风险中&#xff0c;修改器的占比高达16% 。如此高的占比&#xff0c;修改器的危害…

【Vulnhub 靶场】【Funbox: GaoKao】【简单】【20210606】

1、环境介绍 靶场介绍&#xff1a;https://www.vulnhub.com/entry/funbox-gaokao,707/ 靶场下载&#xff1a;https://download.vulnhub.com/funbox/FunboxGaoKao.ova 靶场难度&#xff1a;简单 发布日期&#xff1a;2021年06月06日 文件大小&#xff1a;1.3 GB 靶场作者&#…

《使用ThinkPHP6开发项目》 - 设置项目环境变量

《使用ThinkPHP6开发项目》 - 安装ThinkPHP框架-CSDN博客 在上一编我们讲了ThinkPHP6框架的创建&#xff0c;创建完成ThinkPHP6框架后&#xff0c;我们这里就可以开始设置我们的环境变量了。 安装完成ThinkPHP6框架生成的项目文件 修改项目配置我们修改项目config文件夹里的对…

Themis: Fast, Strong Order-Fairness in Byzantine Consensus

目录 笔记后续的研究方向摘要引言秩序井然 Themis: Fast, Strong Order-Fairness in Byzantine Consensus CCS 2023 笔记 后续的研究方向 摘要 我们介绍了Themis&#xff0c;这是一种将交易的公平排序引入&#xff08;许可的&#xff09;拜占庭共识协议的方案&#xff0c;最…

LeetCode力扣每日一题(Java):20、有效的括号

一、题目 二、解题思路 1、我的思路 我看到题目之后&#xff0c;想着这可能是力扣里唯一一道我能秒杀的题目了 于是一波操作猛如虎写出了如下代码 public boolean isValid(String s) {char[] c s.toCharArray();for(int i0;i<c.length;i){switch (c[i]){case (:if(c[i]…

代码随想录算法训练营第45天| 70. 爬楼梯 (进阶) 322. 零钱兑换 279.完全平方数

JAVA代码编写 70. 爬楼梯&#xff08;进阶版) 卡码网&#xff1a;57. 爬楼梯&#xff08;第八期模拟笔试&#xff09; 题目描述 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬至多m (1 < m < n)个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f…