第15-02章:理解Class类并获取Class实例
我的后端学习大纲
我的Java学习大纲
1、Java反射机制原理图:
- 源代码通过
Javac编译得到字节码文件,当我执行到new一个对象的时候,字节码文件会通过ClassLoader被加载,然后得到一个Class类对象,存放在堆中,加载完后Cat对象就生成了,生成的这个对象一定知道它是属于哪个Class类对象的

2、理解java.lang.Class类:
1.1.类的加载过程:
a.编译:
- 程序经过
javac.exe命令以后,会编译生成一个或多个字节码文件(.class结尾)
b.类加载:
- 1.我们使用
java.exe命令对某个字节码文件进行解释运行,相当于把某个字节码文件加载到内存中。这个过程就是类加载的过程(不包括编译那一步) - 2,加载到内存中的类,我们就称为
运行时类,这个运行时类,就作为Class类的一个实例对象- 比如
Class clazz = Cat.class,Cat的这个运行时类:Cat.class就是Class类的实例对象 - 换句话说,
Class的实例对象就对应着一个运行时类。类的本质也是对象,万事万物皆对象 - 加载到内存中的运行时类,会缓存一定的时间。在此时间之内,我们可以通过6种不同的方式来获取此运行时类(
获取Class类的实例对象)
- 比如
3、获取Class类实例对象的方法:
根据下图类加载的过程,我们
在不同阶段有不同方式来获取Class类实例对象

3.1.方式1:在代码阶段:
通过Class的静态方法
forName(String classPath)获取
- 1.已知一个类的全类名,且该类在类的路径下,那么就可以通过Class类的静态方法
forName()获取,可以抛出ClassNotFoundExpection - 2.实例对象:
Class cls1 = Class.forName("java.lang.Cat"),这种方式会进行类的静态初始化工作 - 3.
应用场景:多用于配置文件,读取类全路径,加载类
//方式一:调用Class的静态方法:forName(String classPath),参数是类的包路径
Class clazz3 = Class.forName("com.atguigu.java.Person");
//clazz3 = Class.forName("java.lang.String");
System.out.println(clazz3);//输出com.atguigu.java.Person
3.2.方式2:在加载阶段:
在加载阶段,通过调用运行时类的属性
.class获取
- 1.若已经知道具体的类,通过类的class获取,此方式最为安全可靠,程序性能最高,举例如
Class cls = Cat.class;这种方式不会做任何类的初始化工作 - 2.应用场景:
多用于参数传递、如通过反射得到对应的构造器对象。
//方式二:调用运行时类的属性.class
Class clazz1 = Person.class;
System.out.println(clazz1);//输出com.atguigu.java.Person
3.3.方式3:在运行阶段
在运行阶段,通过调用运行时类的对象,通过
对象.getClass()获取
- 1.已
知某个类的实例,调用该实例的getClass()方法获取Class对象实例; - 2.实例:Class cls = 对象.getClass();//运行类型
- 3.应用场景:通过创建好的对象,获取Class对象;
- 4.这种方式:
静态初始化和非静态初始化工作都会进行
//方式三:通过运行时类的对象,调用getClass(),已经知道了Person类的P对象,通过调用这个类的getclass方法就可以获取Class类的实例Person p1 = new Person();Class clazz2 = p1.getClass();System.out.println(clazz2);//输出com.atguigu.java.Person
3.4.方式4:使用类加载器:ClassLoader()
通过
类加载(4种加载器)器获取Class类对象:
- 1.
ClassLoader cls = 对象.getClass().getClassLoader();class clazz4 = cls.loadClass("全类名")
//方式四:使用类的加载器:ClassLoader (了解)ClassLoader classLoader = car.getClass.getClassLoader();//得到类加载器carClass clazz4 = classLoader.loadClass("com.atguigu.java.");//通过类加载器得到Class对象System.out.println(clazz4);


3.5.方式5:基本数据类型获取Class类对象:
- 1.基本数据类型
(int\char\boolean\float\double\byte\long\short)按照如下方式,可以获取到Class类对象Class cls = 基本数据类型.class

3.6.方式6:基本数据类型对应的包装类:
- 1.基本数据类型对应的包装类,可以通过
.type得到Class类对象;Class cls = 包装类.type
//5. 基本数据(int, char,boolean,float,double,byte,long,short) 按如下方式得到Class类对象Class<Integer> integerClass = int.class;Class<Character> characterClass = char.class;Class<Boolean> booleanClass = boolean.class;System.out.println(integerClass);//int//6. 基本数据类型对应的包装类,可以通过 .TYPE 得到Class类对象Class<Integer> type1 = Integer.TYPE;Class<Character> type2 = Character.TYPE; //其它包装类BOOLEAN, DOUBLE, LONG,BYTE等待System.out.println(type1);//下面两个输出的值是一样的System.out.println(integerClass.hashCode());System.out.println(type1.hashCode());
4、获取Class类的实例对象
4.1.哪些类型可以作为Class类的实例对象
- 1.
外部类,成员内部类,静态内部类,局部内部类,匿名内部类 - 2.
interface:接口 - 3.
enum:枚举 - 4.
annotation:注解 - 6.
基本数据类型 - 7.
void - 8.
Class本身
4.2.编码测试:
package com.hspedu.reflection.class_;import java.io.Serializable;/*** 演示哪些类型有Class对象*/
public class AllTypeClass {public static void main(String[] args) {Class<String> cls1 = String.class;//外部类Class<Serializable> cls2 = Serializable.class;//接口Class<Integer[]> cls3 = Integer[].class;//数组Class<float[][]> cls4 = float[][].class;//二维数组Class<Deprecated> cls5 = Deprecated.class;//注解Class<Class> cls6 = Class.class;//注解//枚举Class<Thread.State> cls6 = Thread.State.class;Class<Long> cls7 = long.class;//基本数据类型Class<Void> cls8 = void.class;//void数据类型Class<Class> cls9 = Class.class;//System.out.println(cls1);System.out.println(cls2);System.out.println(cls3);System.out.println(cls4);System.out.println(cls5);System.out.println(cls6);System.out.println(cls7);System.out.println(cls8);System.out.println(cls9);}
}

1.2.理解java.lang.Class类:
- 1.
Class也是类,因此也继承Object类- 在Object类中定义了方法:
public final Class getClass(),这个方法将被所有子类继承。 public final Class getClass()这个方法返回值的类型是一个Class类,此类是Java反射的源头,针对任何你想动态加载、运行的类,唯有先获得相应的Class对象。- 实际上所谓反射从程序的运行结果来看也很好理解,即:
可以通过对象反射求出类的名称

- 在Object类中定义了方法:
- 2.
Class类对象不是new出来的,只能是系统创建出来的;- 通过debugger发现,反射也是通过ClassLoad类加载Class对象




- 通过debugger发现,反射也是通过ClassLoad类加载Class对象
- 3.对于某个类的Class类对象,在
堆内存中只有一份,因为类只加载一次- 一个Class对象对应的是一个加载到JVM中的一个.class文件

- 一个Class对象对应的是一个加载到JVM中的一个.class文件
- 4.
每个类的实例对象都会记得自己是由哪个Class实例对象(运行时类)所生成的 - 5.通过一系列的API和Class类的实例对象可以完整的得到一个类的完整结构:

- 6.
Class对象是存放在堆中的,类的字节码二进制数据,是存放在方法区的,有的地方称之为类的元数据(包括:方法代码,变量名,方法名,访问权限等)

相关文章:
第15-02章:理解Class类并获取Class实例
我的后端学习大纲 我的Java学习大纲 1、Java反射机制原理图: 源代码通过Javac编译得到字节码文件,当我执行到new一个对象的时候,字节码文件会通过ClassLoader被加载,然后得到一个Class类对象,存放在堆中,加…...
【Authing身份云-注册安全分析报告-无验证方式导致安全隐患】
前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 1. 暴力破解密码,造成用户信息泄露 2. 短信盗刷的安全问题,影响业务及导致用户投诉 3. 带来经济损失,尤其是后付费客户,风险巨大,造…...
idea插件推荐之Cool Request
Cool Request是一款基于IDEA的HTTP调试工具,可以看成是轻量版的postman,它会自动扫描项目代码中所有API路径,按项目分组管理。一个类被定义为Controller且其中的方法被RequestMapping或者XXXMapping注解标注以后就会被扫描到。 对应方法左侧会…...
从卫星和飞机等不同传感器方面由QGIS 遥感分析
在地理信息科学 (GIS) 中,遥感是指从远处获取有关地球表面特征信息的行为。遥感数据是从许多不同的平台获取而来,包括卫星、飞机和具有许多不同传感器的固定仪器,包括光谱图像(相机)和激光雷达。最常见的遥感数据形式是卫星和航空图像。 为了充分实现这些照片的价值,需要…...
什么是AIGC?有哪些免费工具?
AIGC(AI Generated Content),即“人工智能生成内容”,是指通过人工智能技术自动生成各种类型的数字内容。AIGC 让机器能够根据输入的信息或数据生成符合人类需求的文本、图像、音频、视频等内容,极大提高了内容创作的效…...
腾讯云升级多个云存储解决方案 以智能化存储助力企业增长
9月6日,在腾讯数字生态大会腾讯云储存专场上,腾讯云升级多个存储解决方案:Data Platform 数据平台解决方案重磅发布,数据加速器 GooseFS、数据处理平台数据万象、日志服务 CLS、高性能并行文件存储 CFS Turbo 等多产品全新升级&am…...
Kubernetes 集群初步部署
Kubernetes 集群初步部署 目标 本手册旨在指导您在多台虚拟机上部署一个基础的Kubernetes集群,并安装必要的工具和组件。 准备工作 确保所有虚拟机已经准备好,并且具有足够的资源来运行Kubernetes集群。虚拟机操作系统版本一致,推荐使用R…...
从源码到成品:直播美颜SDK与主播美颜工具的开发全流程
本篇文章,小编将带你深入了解从源码到成品的开发全流程,探讨如何构建一个功能完善的直播美颜SDK与主播美颜工具。 一、需求分析与技术规划 在开发任何工具之前,需求分析是第一步。在美颜工具的开发过程中,需要明确以下几点&…...
AMD EPYC 9004服务器内存配置深度分析:为何全通道填充是关键?
在一次技术沟通中,客户询问在部署AMD EPYC 9004服务器时,是否应该完全填充内存通道? 考虑到AMD正在用5年的更新周期替换其AMD EPYC 7002 “Rome”和Cascade Lake一代的服务器,他们认为通过减少内存插槽的填充,可以节省…...
redis的事务与管道有什么不同?
Redis 的事务(MULTI/EXEC)和管道(PIPELINE)都是为了执行多条命令,但它们的工作原理和目标不同。以下是两者的详细对比。 1. Redis 事务 (MULTI/EXEC) 特点: 事务的本质:Redis 事务是一组命令的…...
Redis 配置
一、关系型数据库与非关系型数据库 1. 关系型数据库 关系型数据库是一种结构化数据库,基于关系模型(二维表格模型),适合记录数据。通过 SQL(结构化查询语言)进行数据的检索和操作。主流的关系型数据库包括…...
【Qt笔记】QTableWidget控件详解
目录 引言 一、QTableWidget的特点 二、QTableWidget基础 2.1 引入QTableWidget 2.2 基本属性 三、代码示例:初始化QTableWidget 四、编辑功能 4.1 设置单元格为只读 4.2 响应内容更改 五、选择模式 六、样式定制 七、与其他控件的交互 7.1 在单元格…...
高低压配电系统中电弧光的危害有多大?
摘要 故障电弧是一种常见的电气故障现象,尤其在配电系统中,可能对设备安全和电力供应造成严重影响。本文旨在探讨故障电弧对配电系统的危害,并提出相应的预防措施,以增强系统的可靠性和安全性。通过对故障电弧的形成机制、危害分…...
安宝特案例 | AR如何大幅提升IC封装厂检测效率?
前言:如何提升IC封装厂检测效率? 在现代电子产品的制造过程中,IC封装作为核心环节,涉及到复杂处理流程和严格质量检测。这是一家专注于IC封装的厂商,负责将来自IC制造商的晶圆进行保护、散热和导通处理。整个制程繁琐…...
QGIS 如何连接空间库,并实时编辑空间表?编辑后库表如何刷新,保证是最新数据?
文章目录 一、什么是 qgis?二、qgis 如何连接数据库三、实时编辑空间表四、编辑后库表如何刷新,保证是最新数据?五、总结 一、什么是 qgis? QGIS(原称Quantum GIS)是一个用户界面友好的开源桌面端软件&…...
CleanClip for mac(苹果电脑剪切板管理器)
CleanClip 是一款为 Mac 设计的强大剪贴板管理工具,它能够显著提升你的工作效率和生产力。无论是在日常办公中还是进行创意设计,CleanClip 都能帮助你更轻松地管理和使用剪贴板内容。让我们一起来探索一下这个功能丰富的软件吧! 下载地址&am…...
嵌入式栈溢出怎么办?
在写文件的时候,因为把FATFS这些数据结构定义在了函数里,所以栈溢出了,我把比较大的数据结构放在全局变量上,就没事了.目前仅测试阶段,也可以放在堆里.不用的时候释放掉,减少耦合度.或者加static....
工厂安灯系统在优化生产流程上的优势
工厂安灯系统通过可视化的方式,帮助工厂管理者和操作工人及时了解生产状态,快速响应问题,从而优化生产流程。 一、安灯系统实时监控与反馈 安灯系统的核心功能是实时监控生产线的状态。通过在生产现场设置灯光、显示屏等设备,工人…...
【Kubernetes】(K8S)彻底卸载详细教程
以下全部操作都是使用root用户进行(非root用户可以使用sudo),并且全部命令都需要在Kubernetes集群的所有节点分别执行: 第一步、停止K8S 所有节点执行: 1 2 3 systemctl stop kubelet systemctl stop etcd systemct…...
web基础之文件上传
1.下载安装 下载地址 链接:百度网盘-链接不存在 提取码:jhks 安装 直接把他放在phpstudy的WWW目录中。(phpstudy的下载安装,可以自行百度一下) 打开 访问地址:127.0.0.1/upload-labs 问题 这里可能…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
手机平板能效生态设计指令EU 2023/1670标准解读
手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...
通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器
拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件: 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...
Vue ③-生命周期 || 脚手架
生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...
Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
作者:来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布,Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明,Elastic 作为 …...
