Java中的反射
类加载器
(1)类的加载
当我们的程序在运行后,第一次使用某个类的时候,会将此类的class文件读取到内存,并将此类
的所有信息存储到一个Class对象中。

说明:
a.图中的Class对象是指:java.lang.Class类的对象,此类由Java类库提供,专门用于存储类的信息。
b.我们程序中可以通过:"类名.class",或者"对象.getClass()"方法获取这个Class对象
(2)类的加载时机
a.创建类的实例。
b.调用类的静态变量,或者为静态变量赋值。
c.调用类的静态方法。
d.使用反射方式来强制创建某个类或接口对应的java.lang.Class对象。
e.初始化某个类的子类。
f.直接使用java.exe命令来运行某个主类。
以上六种情况的任何一种,都可以导致JVM将一个类加载到方法区。
(3)类加载器
类加载器:是负责将磁盘上的某个class文件读取到内存并生成Class的对象。
Java中有三种类加载器,它们分别用于加载不同种类的class:
a.启动类加载器(Bootstrap ClassLoader):用于加载系统类库<JAVA_HOME>\bin目录下的class,例如:rt.jar。
b.扩展类加载器(Extension ClassLoader):用于加载扩展类库<JAVA_HOME>\lib\ext目录下的class。
c.应用程序类加载器(Application ClassLoader):用于加载我们自定义类的加载器。
public class Test{ public static void main(String[] args) {System.out.println(Test.class.getClassLoader());//sun.misc.Launcher$AppClassLoaderSystem.out.println(String.class.getClassLoader());//null(API中说明:一些实现 可能使用null来表示引导类加载器。 如果此类由引导类加载器加载,则此方法将在此类实现中返回null。 )}
}(4)双亲委派机制

上图展示了"类加载器"的层次关系,这种关系称为类加载器的"双亲委派模型":
a."双亲委派模型"中,除了顶层的启动类加载器外,其余的类加载器都应当有自己的"父级类加载器"。
b.这种关系不是通过"继承"实现的,通常是通过"组合"实现的。通过"组合"来表示父级类加载器。
c."双亲委派模型"的工作过程:
i. 某个"类加载器"收到类加载的请求,它首先不会尝试自己去加载这个类,而是把请求交给父
级类加载器。
ii.因此,所有的类加载的请求最终都会传送到顶层的"启动类加载器"中。
iii.如果"父级类加载器"无法加载这个类,然后子级类加载器再去加载。
(5)双亲委派机制的好处
双亲委派机制的一个显而易见的好处是:Java的类随着它的类加载器一起具备了一种带有优先级的层次
关系。例如:java.lang.Object。它存放在rt.jar中。无论哪一个类加载器要加载这个类,最终都是委派
给处于顶端的"启动类加载器"进行加载,因此java.lang.Object类在程序的各种类加载器环境中都是同一
个类。
相反,如果没有"双亲委派机制",如果用户自己编写了一个java.lang.Object,那么当我们编写其它类
时,这种隐式的继承使用的将会是用户自己编写的java.lang.Object类,那将变得一片混乱。
反射的概述
(1)反射的引入
问题:IDEA中的对象是怎么知道类有哪些属性,哪些方法的呢?
答:通过反射技术对象类进行了解剖得到了类的所有成员。
(2)反射的概念
反射是一种机制,利用该机制可以在程序运行过程中对类进行解剖并操作类中的所有成员(成员变量,成员方 法,构造方法)。
(3)使用反射操作类成员的前提
要获得该类字节码文件对象,就是Class对象。
(4)反射在实际开发中的应用
a.开发IDEA(集成开发环境),比如IDEA,Eclipse
b.各种框架的设计和学习 比如Spring,Mybaits....
Class对象的获取方式
(1)三种获取方式
方式1: 通过类名.class获得
方式2:通过对象名.getClass()方法获得
方式3:通过Class类的静态方法获得: static Class forName("类全名")
每一个类的Class对象都只有一个。
示例代码:
package com.test.code.reflex;public class Student {
}public class Demo01 {public static void main(String[] args) throws ClassNotFoundException {// 获得Student类对应的Class对象Class<Student> c1 = Student.class;// 创建学生对象Student stu = new Student();Class<? extends Student> c2 = stu.getClass();System.out.println(c1 == c2);// 通过Class类的静态方法获得: static Class forName("类全名")Class<?> c3 = Class.forName("com.test.code.reflex.Student");System.out.println(c1 == c3);System.out.println(c2 == c3);}
}Demo01运行结果:

(2)Class类常用方法
String getSimpleName(); 获得类名字符串:类名
String getName(); 获得类全名:包名+类名
T newInstance() ; 创建Class对象关联类的对象示例代码:
public class Demo02 {public static void main(String[] args) throws IllegalAccessException, InstantiationException {// 获得Class对象Class<Student> c = Student.class;// 获得类名字符串:类名System.out.println(c.getSimpleName());// 获得类全名:包名 + 类名System.out.println(c.getName());// 创建对象Student stu = (Student)c.newInstance();System.out.println(stu);}
}Demo02运行结果:

4.反射之操作构造方法
(1)Constructor类概述
反射之操作构造方法的目的:获得Constructor对象来创建类的对象。
Constructor类概述:类中的每一个构造方法都是一个Constructor类的对象
(2)Class类中与Constructor相关的方法
1. Constructor getConstructor(Class... parameterTypes)
* 根据参数类型获得对应的Constructor对象。
* 只能获得public修饰的构造方法
2. Constructor getDeclaredConstructor(Class... parameterTypes)
* 根据参数类型获得对应的Constructor对象
* 可以是public、protected、(默认)、private修饰符的构造方法。
3. Constructor[] getConstructors()
* 获得类中的所有构造方法对象,只能获得public的
4. Constructor[] getDeclaredConstructors()
* 获得类中的所有构造方法对象
* 可以是public、protected、(默认)、private修饰符的构造方法。
(3)Constructor对象常用方法
1. T newInstance(Object... initargs)"—— 根据指定的参数创建对象
2. void setAccessible(true) 设置"暴力反射"——是否取消权限检查,true取消权限检查,false表示不取消
示例代码:
public class Student {private String name;private String sex;private int age;//公有构造方法public Student(String name, String sex, int age) {this.name = name;this.sex = sex;this.age = age;}//私有构造方法private Student(String name, String sex) {this.name = name;this.sex = sex;}}public class Demo03 {/*** Constructor[] getConstructors()* 获得类中的所有构造方法对象,只能获得public的* Constructor[] getDeclaredConstructors()* 获得类中的所有构造方法,包括private修饰的*/@Testpublic void test03(){// 获得Class对象Class<Student> c = Student.class;// 获得类中的所有构造方法对象,只能是public修饰的Constructor<?>[] cons_one = c.getConstructors();for (Constructor<?> con : cons_one) {System.out.println(con);}System.out.println("--------------------------------");// 获取类中所有的构造方法,包括public、protected、(默认)、private的Constructor<?>[] cons_two = c.getDeclaredConstructors();for (Constructor<?> con : cons_two) {System.out.println(con);}}/*** Constructor getDeclaredConstructor(Class... parameterTypes)* 根据参数类型获得对应的Constructor对象*/@Testpublic void test02() throws Exception {// 获得Class对象Class<Student> c = Student.class;// 获得两个参数构造方法对象Constructor<Student> con = c.getDeclaredConstructor(String.class, String.class);// 取消权限检查(暴力反射)con.setAccessible(true);// 根据构造方法创建对象Student stu = con.newInstance("liuyifei", "女");System.out.println(stu);}/*** Constructor getConstructor(Class... parameterTypes)* 根据参数类型获得对应的Constructor对象*/@Testpublic void test01() throws Exception {// 获得Class对象Class<Student> c = Student.class;// 获得无参数构造方法对象 注意:记得在Student类中加无参构造方法,不然会报错Constructor<Student> con = c.getConstructor();// 根据构造方法创建对象Student student = con.newInstance();System.out.println(student);// 获得有参数的构造方法对象Constructor<Student> con2 = c.getConstructor(String.class, String.class, int.class);// 创建对象Student stu2 = con2.newInstance("jack", "男", 18);System.out.println(stu2);}}5.反射之操作成员方法
(1)Method类概述
反射之操作成员方法的目的:操作Method对象来调用成员方法
Method类概述:每一个成员方法都是一个Method类的对象。
(2)Class类中与Method相关的方法
* Method getMethod(String name,Class...args);
根据方法名和参数类型获得对应的构造方法对象,只能获得public的
* Method getDeclaredMethod(String name,Class...args);
根据方法名和参数类型获得对应的构造方法对象,包括public、protected、(默认)、private的
* Method[] getMethods();
获得类中的所有成员方法对象,返回数组,只能获得public修饰的且包含父类的
* Method[] getDeclaredMethods();
获得类中的所有成员方法对象,返回数组,只获得本类的,包括public、protected、(默认)、 private的
(3)Method对象常用方法
* Object invoke(Object obj, Object... args)
调用指定对象obj的该方法
args:调用方法时传递的参数
* void setAccessible(true)
设置"暴力访问"——是否取消权限检查,true取消权限检查,false表示不取消
示例代码:
public class Demo04 {/*** Method[] getMethods();* 获得类中的所有成员方法对象,返回数组,只能获得public修饰的且包含父类的* Method[] getDeclaredMethods();* 获得类中的所有成员方法对象,返回数组,只获得本类的,包含private修饰的*/@Testpublic void test03() {// 获得Class对象Class<Student> c = Student.class;// 获得类中的所有成员方法对象,返回数据,只能获得public修饰的且包含父类的// Method[] methods = c.getMethods();// 获得类中的所有成员方法对象,返回数组,只获得本类的,包含private修饰的Method[] methods = c.getDeclaredMethods();for (Method method : methods) {System.out.println(method);}}/*** Method getDeclaredMethod(String name,Class...args);* 根据方法名和参数类型获得对应的构造方法对象,*/@Testpublic void test02() throws Exception {// 获得Class对象Class<Student> c = Student.class;// 根据Class对象创建学生对象Student stu = c.newInstance();// 获得sleep方法对应的Method对象Method m = c.getDeclaredMethod("sleep");// 暴力反射m.setAccessible(true);// 通过m对象执行sleep方法m.invoke(stu);}/*** Method getMethod(String name,Class...args);* 根据方法名和参数类型获得对应的构造方法对象,*/@Testpublic void test01() throws Exception {// 获得Class对象Class<Student> c = Student.class;// 根据Class对象创建学生对象Student stu = c.newInstance();// // 获得study方法对应的Method对象
// Method m = c.getMethod("study");
// // 通过m对象执行study方法
// m.invoke(stu);// 获得study方法对应的Method对象Method m2 = c.getMethod("study", int.class);// 通过m2对象执行study方法m2.invoke(stu, 8);}}6.反射之操作成员变量
(1)Field类概述
反射之操作成员变量的目的 :通过Field对象给对应的成员变量赋值和取值
Field类概述: 每一个成员变量都是一个Field类的对象。
(2)Class类中与Field相关的方法
Field getField(String name);
根据成员变量名获得对应Field对象,只能获得public修饰
Field getDeclaredField(String name);
根据成员变量名获得对应Field对象,包括public、protected、(默认)、private的
Field[] getFields();
获得所有的成员变量对应的Field对象,只能获得public的
Field[] getDeclaredFields();
获得所有的成员变量对应的Field对象,包括public、protected、(默认)、private的
(3)Field对象常用方法
void set(Object obj, Object value)
void setInt(Object obj, int i)
void setLong(Object obj, long l)
void setBoolean(Object obj, boolean z)
void setDouble(Object obj, double d)
Object get(Object obj)
int getInt(Object obj)
long getLong(Object obj)
boolean getBoolean(Object ob)
double getDouble(Object obj)
void setAccessible(true); // 暴力反射,设置为可以直接访问私有类型的属性。
Class getType(); // 获取属性的类型,返回Class对象。
setXxx方法都是给对象obj的属性设置使用,针对不同的类型选取不同的方法。
getXxx方法是获取对象obj对应的属性值的,针对不同的类型选取不同的方法。
示例代码:
public class Student {public String name;private String gender;public String toString() {return "Student [name = " + name + " , gender = " + gender + "]";}}public class Demo05 {/*** Field[] getFields();* 获得所有的成员变量对应的Field对象,只能获得public的* Field[] getDeclaredFields();* 获得所有的成员变量对应的Field对象,包含private的*/@Testpublic void test02(){// 获得Class对象Class<Student> c = Student.class;// 获得所有的成员变量对应的Field对象// Field[] fields = c.getFields();// 获得所有的成员变量对应的Field对象,包括privateField[] fields = c.getDeclaredFields();for (Field field : fields) {System.out.println(field);}}/*** Field getField(String name);* 根据成员变量名获得对应Field对象,只能获得public修饰* Field getDeclaredField(String name);* 根据成员变量名获得对应Field对象,包含private修饰的*/@Testpublic void test01() throws Exception {// 获得Class对象Class<Student> c = Student.class;// 创建对象Student stu = c.newInstance();// 获得成员变量name对应的Field对象Field f = c.getField("name");// 给成员变量name赋值// 给指定对象stu的name属性赋值为jackf.set(stu,"jack");// 获得指定对象stu成员变量name的值System.out.println(f.get(stu)); // jack// 获得成员变量的名字System.out.println(f.getName()); //name// 给成员变量gender赋值// 获得成员变量gender对应的Field对象Field f1 = c.getDeclaredField("gender");// 暴力反射f1.setAccessible(true);// 给指定对象stu的gender属性赋值为男f1.set(stu,"男");System.out.println(stu);}}wx 搜索“自律的西瓜L”
相关文章:
Java中的反射
类加载器(1)类的加载当我们的程序在运行后,第一次使用某个类的时候,会将此类的class文件读取到内存,并将此类的所有信息存储到一个Class对象中。说明:a.图中的Class对象是指:java.lang.Class类的…...
STM32入门笔记(03):STM32F103C8T6定时器的输入捕获模式和编码器模式(SPL库函数版)
目录1.定时器的输入捕获模式定时器输入捕获实验代码实现程序说明实现思路实现效果知识要点2.定时器的编码器模式定时器编码器实验代码实现实验思路知识要点参考资料先导知识 [1] STM32入门笔记(02):定时器之定时器中断、输入捕获和PWM输出(SPL库函数版)…...
《网络安全》零基础教程-适合小白科普
《网络安全》零基础教程 目录 目录 《网络安全》零基础教程 第1章 网络安全基础 什么是网络安全 常见的网络安全威胁 网络安全的三个基本要素 网络安全的保障措施 第2章 网络攻击类型 病毒、蠕虫、木马、后门 DoS、DDoS攻击 SQL注入、XSS攻击 …...
微信小程序语言与web开发语言的区别
WXML与HTML的区别def:WXML是小程序框架设计的一套标签语言,用来构建小程序页面的结构,作用类似于web开发中的HTML区别:标签名称的不同如HTML中的div,span,img,a分别对应wxml中的view,…...
【2022-09-14】米哈游秋招笔试三道编程题
第一题:最短子串 题目描述 米小游拿到了一个字符串,她想截取一个连续子串,使得该子串中包含至少k个连续的“mihoyo”。 你可以帮米小游求出最短的子串长度,以及对应的子串位置吗? 输入描述 第一行输入两个正整数n…...
云监控能力介绍
传统监控介绍 监控系统必要性 监控系统的能力清单 市面上常见商业及开源监控工具集 传统监控体系的不足 云监控介绍 云监控(CloudMonitor)是一项针对云资源和互联网应用进行监控的服务。 云监控为云上用户提供开箱即用的企业级开放型一站式监控解决方…...
HTML 文档类型
<!DOCTYPE> 声明帮助浏览器正确地显示网页。 <!DOCTYPE> 声明 Web 世界中存在许多不同的文档。只有了解文档的类型,浏览器才能正确地显示文档。 HTML 也有多个不同的版本,只有完全明白页面中使用的确切 HTML 版本,浏览器才能完…...
【UML】软件设计说明书 (完结)
目录一. 🦁 前言1.1 编写目的1.2 背景1.3 定义1.4 参考资料二. 🦁 总体设计2.1需求规定2.1.1 系统描述2.1.2 系统用例图2.2 运行环境2.2.1 设备2.2.2 支持软件2.2.3 接口2.2.4 控制2.3 基本设计概念2.4 系统结构三. 🦁 用例分析与设计3.1 用户…...
MATLAB——FFT(快速傅里叶变换)
基础知识 FFT即快速傅里叶变换,利用周期性和可约性,减少了DFT的运算量。常见的有按时间抽取的基2算法(DIT-FFT)按频率抽取的基2算法(DIF-FFT)。 1.利用自带函数fft进行快速傅里叶变换 若已知序列x[4,3,2,6…...
力扣-进店却未进行过交易的顾客
大家好,我是空空star,本篇带大家了解一道简单的力扣sql练习题。 文章目录前言一、题目:1581. 进店却未进行过交易的顾客二、解题1.正确示范①提交SQL运行结果2.正确示范②提交SQL运行结果3.正确示范③提交SQL运行结果4.正确示范④提交SQL运行…...
一文解决vscode中借助CMake配置使用Opencv过程中的所有问题
vscode中借助CMake配置使用opencv过程中的问题 vscode编译工程的完整过程 编写好CMakeLists.txtvscode中 ctrlshiftp 选择cmake configurevscode中 ctrlshiftp 选择cmake build CMake问题 1. set OpenCV_FOUND to FALSE so package “OpenCV” is considered to be NOT FOU…...
Golang每日一练(leetDay0004)
10. 正则表达式匹配 Regular Expression Matching 给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 . 和 * 的正则表达式匹配。 . 匹配任意单个字符* 匹配零个或多个前面的那一个元素 所谓匹配,是要涵盖 整个 字符串 s的,而不是部分…...
手机忘记密码解锁的 6 大软件方法
您可能想要解锁手机的原因有很多。也许您正在海外旅行并想使用当地的 SIM 卡,或者您可能刚买了一部二手手机并且需要删除之前所有者的个人数据。您可能想知道如何获得可以免费解锁任何手机的软件。Android 用户可以使用他们的指纹、面部识别或 PIN。您也可以通过快速…...
MySQL数据库的基础语法总结(1)
MySql一.数据库,数据表的基本操作1.数据库的基本操作2. 数据表的基本操作2.1 数据库的数据类型2.1.1 整数类型2.1.2 浮点数类型和定点数类型2.1.3 字符串类型2.1.4 日期与时间类型2.2 数据表的基本操作2.2.1 创建一个数据表2.2.2 查看数据表2.2.3 查看表的基本信息的MySQL指令2…...
Linux之进程创建
本节目录1.fork函数初识2.fork函数返回值3.写时拷贝1.fork函数初识 在Linux中,fork函数是一个非常重要的函数,它从已存在的进程中创建一个新进程。新进程叫做子进程,而原进程叫做父进程。 #include <unistd.h> pid_t fork(void); 返回…...
DCL 管理用户与权限控制
目录 DCL 查询用户 案例 权限控制 案例 DCL DCL英文全称是Data Control Language(数据控制语言),用来管理数据库用户、控制数据库的访问权限。 查询用户 1、查询用户 select * from mysql.user; 2、创建用户 CREATE USER 用户名主机名 IDENTIFIED BY 密码;…...
如何使用 Python 检测和识别车牌(附 Python 代码)
文章目录创建Python环境如何在您的计算机上安装Tesseract OCR?技术提升磨砺您的Python技能车牌检测与识别技术用途广泛,可以用于道路系统、无票停车场、车辆门禁等。这项技术结合了计算机视觉和人工智能。 本文将使用Python创建一个车牌检测和识别程序。…...
[Python题解] CodeForces 1804 D. Accommodation
✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心&…...
【设计模式】访问者模式
访问者模式 访问者模式被称为是最复杂的设计模式,比较难理解并且使用频率不高。 在 GoF 的《设计模式》⼀书中,访问者者模式(Visitor Design Pattern)是这么定义的: Allows for one or more operation to be applied to a set o…...
蓝桥杯刷题冲刺 | 倒计时27天
作者:指针不指南吗 专栏:蓝桥杯倒计时冲刺 🐾马上就要蓝桥杯了,最后的这几天尤为重要,不可懈怠哦🐾 文章目录1.递增序列2.等差素数列3.七段码4.亲戚5.连通块中点的数量1.递增序列 题目 链接:&am…...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...
Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...
【C++】纯虚函数类外可以写实现吗?
1. 答案 先说答案,可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...
