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

news2024/9/20 2:38:13

我的后端学习大纲

我的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();//得到类加载器car
 Class 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对象是存放在堆中的类的字节码二进制数据,是存放在方法区的,有的地方称之为类的元数据(包括:方法代码,变量名,方法名,访问权限等)
    在这里插入图片描述

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

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

相关文章

系统分析师10:知识产权与标准化

1 内容提要 保护范围与对象&#xff08;★★★★)保护期限&#xff08;★)知识产权人确定(★★★)侵权判断(★★★)标准的分类标准代号的识别 2 保护范围与对象 使用许可 按照被许可使用权的排他性强弱不同&#xff0c;可以将使用许可分为以下三种: ①独占使用许可-仅1个授权…

中国电子学会202406青少年软件编程(Python)等级考试试卷(一级)真题与解析

青少年软件编程(Python)等级考试试卷(一级) 分数:100题数:37 一、单选题(共25题,共50分) 1.在使用turtle绘制图形时,如果要控制小海龟移动到 x 坐标为 200,y 坐标为150 的位置,以下代码能够实现效果的是?( ) A. turtle.go(150, 200) B. turtle.go(200, 150) …

在线客服如何与呼叫系统结合使用?

以下是在线客服与呼叫系统结合使用的常见方式&#xff1a; 1.从客户接入角度 a多渠道整合&#xff1a; 将网站在线客服、手机APP在线客服、社交媒体平台&#xff08;如微信公众号、微博私信等&#xff09;以及呼叫系统的电话接入渠道整合在一个统一的平台上。例如&#xf…

HTTP跨域请求时为什么要发送options请求

跨域请求 浏览器同源策略同源策略一般限制Ajax网络请求&#xff0c;不能跨域请求server不会限制<link> <img> <script> <iframe> 加载第三方资源 JSONP实现跨域 <!-- aa.com网页 --> <script>window.onSuccess function(data) {consol…

如何选择PCB板材?

pcb板材的基本参数有哪些&#xff1f; 1. 厚度&#xff1a;PCB板材厚度是指板子的整体厚度。常见的厚度有0.8mm、1.0mm、1.6mm、2.0mm等。在选择时需要根据实际需求进行选择&#xff0c;通常需要根据元件数量、限制空间和性能要求来决定。 2. 热膨胀系数&#xff1a;热膨胀系数…

把设计模式用起来(3)用不好的原因之时机不对

上一篇&#xff1a;《把设计模式用起来&#xff08;3&#xff09;——用不好的原因 之 实践不足》https://blog.csdn.net/nanyu/article/details/141939342 本篇继续讲设计模式用不好的常见原因&#xff0c;这是第二个&#xff1a;使用设计模式的时机不对。 二、时机不对 这里…

linux的文本编辑器vim常用操作命令介绍

目录 一、vim介绍 二、vim的特点 1、模式编辑 2、强大的命令集 3、可配置性 4、插件系统 5、多平台支持 三、vim的基础用法 1、打开或创建文件 2、移动光标 3、编辑文件 4、返回命令模式 5、保存文件并退出 6、不保存并退出 四、vim的部分进阶用法 1、快速删除行 2、撤销操作…

数据结构——复杂度讲解

已经太久没用更新了&#xff0c;由于各种原因&#xff0c;导致很久没用更新了&#xff0c;但是停更期间我也是一直在很努力的学习与复习之前学过的知识&#xff0c;读了两本C语言的数据&#xff0c;初学者也是可以看的&#xff0c;推荐给大家&#xff0c;如果需要pdf&#xff0…

SAP TR传输工具

实现效果 不用释放请求&#xff0c;可以把对方对象从DEV直接释放到目标系统中 表对象设计 表结构设计 1. ZSAB0007 Develop toolset: current working objects 2. Structure&#xff1a;ZSAB0008 发版计划请求列表 3. ZSAB0022 Development objects - object search r…

Bootstrap布局实例(偏移列)

偏移是一个用于更专业的布局的有用功能。它们可用来给列腾出更多的空间。例如&#xff0c;.col-xs-* 类不支持偏移&#xff0c;但是它们可以简单地通过使用一个空的单元格来实现该效果。 为了在大屏幕显示器上使用偏移&#xff0c;请使用 .col-md-offset-* 类。这些类会把一个…

Vue3: setup语法糖

一. setup语法糖 在 Vue 3 中&#xff0c;setup 语法糖是一种简化组件内部状态和方法管理的特性。它允许你将组件的逻辑直接编写在组件的定义中&#xff0c;而不是像 Vue 2 那样需要在 methods 和 data 属性中管理。setup 语法糖基于 ES6 的类的静态方法&#xff0c;允许你更灵…

改进大语言模型的最全方法!

这是一篇关于适应开源大语言模型&#xff08;LLMs&#xff09;的三部系列博客的第一篇。本文探讨将LLM适应领域数据的各种方法。 第二部分讨论如何确定微调&#xff08;fine-tuning&#xff09;是否适合您的用例。第三部分探讨策划良好训练数据集的一些经验法则。 0 引言 大…

NX二次开发—批量导出点工具

在NX上进行二次开发&#xff0c;设计一个UI界面&#xff0c;将选择的点导出 在NX上&#xff0c;进行UI样式编辑器 添加选择对象&#xff0c;修改标题&#xff0c;设置为多选 创建一个组&#xff0c;添加枚举&#xff0c;设置标题和枚举内容&#xff0c;不显示枚举标题LabelVis…

云微客AI文案编写,有手就能出“爆款”

​现如今新媒体时代&#xff0c;短视频平台已经成为了企业品牌宣传的重要战场&#xff0c;那么如何利用短视频平台进行品牌宣传、制作爆款视频就成为了各大商企需要解决的难题。由此&#xff0c;不得不提到云微客短视频矩阵系统&#xff0c;一键助力商企品牌轻松打造爆款内容。…

python学习第九节:爬虫实战-抓取地址库

python学习第九节&#xff1a;爬虫实战-抓取地址库 话不多说&#xff0c;直接上代码&#xff1b;下面的代码是从统计局抓取地址库并保存为json格式和excel格式。大家拿到代码直接运行即可。 #codingutf-8 #加入上面这行代码表示可以在下面代码中包含中文 import bs4 #网页解析…

wopop靶场漏洞挖掘练习

一、sql注入漏洞 1.在搜索框输入-1 union select 1,2,3# 可以看到页面有回显 2.查询数据库名 -1 union select 1,2,database()# 3.通过查询admin表的数据可以进行登录后台 -1 union select 1,2,group_concat(user_name,user_pass) from admin# 二、文件上传漏洞 1.登录后台…

李龙受邀参加济南高新区“质量月”能力提升活动,并做专题培训

9月11日&#xff0c;济南高新区在山东省知识产权公共服务平台举行2024年“质量月”启动仪式暨质量管理能力提升系列活动。安畅检测首席技术专家李龙先生出席了“质量月”启动仪式 &#xff0c;并为到场企业代表就信创产业相关知识做了专题培训。 济南市市场监督管理局党组成员王…

101.游戏安全项目-创建人物对象结构

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;易道云信息技术研究院 上一个内容&#xff1a;100.游戏安全项目-不可见数据的搜索 以 98.游戏的启动与多开-分析与实现多开器 它的代码…

7.sklearn-逻辑回归、精确率和召回率、ROC曲线和AUC指标

文章目录 环境配置&#xff08;必看&#xff09;头文件引用1.逻辑回归1.1 API介绍1.2 代码实现1.3 运行结果 2.分类评估方法2.1 精确率(Precision)2.2 召回率(Recall)2.3 F1-score2.4 分类评估报告api2.5 代码工程2.6 运行结果 3.ROC曲线与AUC指标3.1 TPR和FPR3.2 ROC曲线3.3 A…

2024年宠物空气净化器选购攻略?哪款最值得买

表妹在去年刚上大学就养了一只爱掉毛的银渐层&#xff0c;宿舍矛盾不断激化&#xff0c;甚至一度产生了退学的念头。 究其原因&#xff0c;主要是她觉得刚进大学太孤独和身边的人都不太熟&#xff0c;所以就不想聊天&#xff0c;为了缓解这种孤独养了一只银渐层&#xff0c;有…