当前位置: 首页 > news >正文

第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对象。
    • 实际上所谓反射从程序的运行结果来看也很好理解,即:可以通过对象反射求出类的名称
      在这里插入图片描述
  • 2.Class类对象不是new出来的,只能是系统创建出来的
    • 通过debugger发现,反射也是通过ClassLoad类加载Class对象
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
  • 3.对于某个类的Class类对象,在堆内存中只有一份,因为类只加载一次
    • 一个Class对象对应的是一个加载到JVM中的一个.class文件
      在这里插入图片描述
  • 4.每个类的实例对象都会记得自己是由哪个Class实例对象(运行时类)所生成的
  • 5.通过一系列的API和Class类的实例对象可以完整的得到一个类的完整结构:
    在这里插入图片描述
  • 6.Class对象是存放在堆中的类的字节码二进制数据,是存放在方法区的,有的地方称之为类的元数据(包括:方法代码,变量名,方法名,访问权限等)
    在这里插入图片描述

相关文章:

第15-02章:理解Class类并获取Class实例

我的后端学习大纲 我的Java学习大纲 1、Java反射机制原理图&#xff1a; 源代码通过Javac编译得到字节码文件&#xff0c;当我执行到new一个对象的时候&#xff0c;字节码文件会通过ClassLoader被加载&#xff0c;然后得到一个Class类对象&#xff0c;存放在堆中&#xff0c;加…...

【Authing身份云-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…...

idea插件推荐之Cool Request

Cool Request是一款基于IDEA的HTTP调试工具&#xff0c;可以看成是轻量版的postman&#xff0c;它会自动扫描项目代码中所有API路径&#xff0c;按项目分组管理。一个类被定义为Controller且其中的方法被RequestMapping或者XXXMapping注解标注以后就会被扫描到。 对应方法左侧会…...

从卫星和飞机等不同传感器方面由QGIS 遥感分析

在地理信息科学 (GIS) 中,遥感是指从远处获取有关地球表面特征信息的行为。遥感数据是从许多不同的平台获取而来,包括卫星、飞机和具有许多不同传感器的固定仪器,包括光谱图像(相机)和激光雷达。最常见的遥感数据形式是卫星和航空图像。 为了充分实现这些照片的价值,需要…...

什么是AIGC?有哪些免费工具?

AIGC&#xff08;AI Generated Content&#xff09;&#xff0c;即“人工智能生成内容”&#xff0c;是指通过人工智能技术自动生成各种类型的数字内容。AIGC 让机器能够根据输入的信息或数据生成符合人类需求的文本、图像、音频、视频等内容&#xff0c;极大提高了内容创作的效…...

腾讯云升级多个云存储解决方案 以智能化存储助力企业增长

9月6日&#xff0c;在腾讯数字生态大会腾讯云储存专场上&#xff0c;腾讯云升级多个存储解决方案&#xff1a;Data Platform 数据平台解决方案重磅发布&#xff0c;数据加速器 GooseFS、数据处理平台数据万象、日志服务 CLS、高性能并行文件存储 CFS Turbo 等多产品全新升级&am…...

Kubernetes 集群初步部署

Kubernetes 集群初步部署 目标 本手册旨在指导您在多台虚拟机上部署一个基础的Kubernetes集群&#xff0c;并安装必要的工具和组件。 准备工作 确保所有虚拟机已经准备好&#xff0c;并且具有足够的资源来运行Kubernetes集群。虚拟机操作系统版本一致&#xff0c;推荐使用R…...

从源码到成品:直播美颜SDK与主播美颜工具的开发全流程

本篇文章&#xff0c;小编将带你深入了解从源码到成品的开发全流程&#xff0c;探讨如何构建一个功能完善的直播美颜SDK与主播美颜工具。 一、需求分析与技术规划 在开发任何工具之前&#xff0c;需求分析是第一步。在美颜工具的开发过程中&#xff0c;需要明确以下几点&…...

AMD EPYC 9004服务器内存配置深度分析:为何全通道填充是关键?

在一次技术沟通中&#xff0c;客户询问在部署AMD EPYC 9004服务器时&#xff0c;是否应该完全填充内存通道&#xff1f; 考虑到AMD正在用5年的更新周期替换其AMD EPYC 7002 “Rome”和Cascade Lake一代的服务器&#xff0c;他们认为通过减少内存插槽的填充&#xff0c;可以节省…...

redis的事务与管道有什么不同?

Redis 的事务&#xff08;MULTI/EXEC&#xff09;和管道&#xff08;PIPELINE&#xff09;都是为了执行多条命令&#xff0c;但它们的工作原理和目标不同。以下是两者的详细对比。 1. Redis 事务 (MULTI/EXEC) 特点&#xff1a; 事务的本质&#xff1a;Redis 事务是一组命令的…...

Redis 配置

一、关系型数据库与非关系型数据库 1. 关系型数据库 关系型数据库是一种结构化数据库&#xff0c;基于关系模型&#xff08;二维表格模型&#xff09;&#xff0c;适合记录数据。通过 SQL&#xff08;结构化查询语言&#xff09;进行数据的检索和操作。主流的关系型数据库包括…...

【Qt笔记】QTableWidget控件详解

目录 引言 一、QTableWidget的特点 二、QTableWidget基础 2.1 引入QTableWidget 2.2 基本属性 三、代码示例&#xff1a;初始化QTableWidget 四、编辑功能 4.1 设置单元格为只读 4.2 响应内容更改 五、选择模式 六、样式定制 七、与其他控件的交互 7.1 在单元格…...

高低压配电系统中电弧光的危害有多大?

摘要 故障电弧是一种常见的电气故障现象&#xff0c;尤其在配电系统中&#xff0c;可能对设备安全和电力供应造成严重影响。本文旨在探讨故障电弧对配电系统的危害&#xff0c;并提出相应的预防措施&#xff0c;以增强系统的可靠性和安全性。通过对故障电弧的形成机制、危害分…...

安宝特案例 | AR如何大幅提升IC封装厂检测效率?

前言&#xff1a;如何提升IC封装厂检测效率&#xff1f; 在现代电子产品的制造过程中&#xff0c;IC封装作为核心环节&#xff0c;涉及到复杂处理流程和严格质量检测。这是一家专注于IC封装的厂商&#xff0c;负责将来自IC制造商的晶圆进行保护、散热和导通处理。整个制程繁琐…...

QGIS 如何连接空间库,并实时编辑空间表?编辑后库表如何刷新,保证是最新数据?

文章目录 一、什么是 qgis&#xff1f;二、qgis 如何连接数据库三、实时编辑空间表四、编辑后库表如何刷新&#xff0c;保证是最新数据&#xff1f;五、总结 一、什么是 qgis&#xff1f; QGIS&#xff08;原称Quantum GIS&#xff09;是一个用户界面友好的开源桌面端软件&…...

CleanClip for mac(苹果电脑剪切板管理器)

CleanClip 是一款为 Mac 设计的强大剪贴板管理工具&#xff0c;它能够显著提升你的工作效率和生产力。无论是在日常办公中还是进行创意设计&#xff0c;CleanClip 都能帮助你更轻松地管理和使用剪贴板内容。让我们一起来探索一下这个功能丰富的软件吧&#xff01; 下载地址&am…...

嵌入式栈溢出怎么办?

在写文件的时候,因为把FATFS这些数据结构定义在了函数里,所以栈溢出了,我把比较大的数据结构放在全局变量上,就没事了.目前仅测试阶段,也可以放在堆里.不用的时候释放掉,减少耦合度.或者加static....

工厂安灯系统在优化生产流程上的优势

工厂安灯系统通过可视化的方式&#xff0c;帮助工厂管理者和操作工人及时了解生产状态&#xff0c;快速响应问题&#xff0c;从而优化生产流程。 一、安灯系统实时监控与反馈 安灯系统的核心功能是实时监控生产线的状态。通过在生产现场设置灯光、显示屏等设备&#xff0c;工人…...

【Kubernetes】(K8S)彻底卸载详细教程

以下全部操作都是使用root用户进行&#xff08;非root用户可以使用sudo&#xff09;&#xff0c;并且全部命令都需要在Kubernetes集群的所有节点分别执行&#xff1a; 第一步、停止K8S 所有节点执行&#xff1a; 1 2 3 systemctl stop kubelet systemctl stop etcd systemct…...

web基础之文件上传

1.下载安装 下载地址 链接&#xff1a;百度网盘-链接不存在 提取码&#xff1a;jhks 安装 直接把他放在phpstudy的WWW目录中。&#xff08;phpstudy的下载安装&#xff0c;可以自行百度一下&#xff09; 打开 访问地址&#xff1a;127.0.0.1/upload-labs 问题 这里可能…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...