类的加载,反射和注解详解

文章目录

  • 类的加载
    • 概述
    • 类加载器
      • 作用
      • 分类
      • 获取类加载器的方式
    • 双亲委派机制
      • 3种加载器的关系
      • 工作机制
    • 类加载器的应用
  • 反射
    • 概述
    • 关键
    • 获取类对象
    • 获取构造器对象
    • 获取方法对象
    • 获取成员变量对象
    • 作用
  • 注解
    • 概述
    • 作用
    • 自定义注解
      • 格式
      • 属性类型
    • 元注解
      • 常见的元注解
    • 注解解析
      • 概述
      • 方法
      • 技巧

类的加载

概述

当程序运行时,会将磁盘中的.class文件加载到内存中,并创建Class对象(基于.class文件创建)
Class对象:存储的是.class文件中的内容(构造方法,成员变量,成员方法)

  • 构造方法:构造器对象Constructor对象
  • 成员变量:字段对象Field对象
  • 成员方法:方法对象Method对象

类加载器

作用

是Java运行时环境的一部分,负责加载字节码文件,即将磁盘上的某个class文件读取到内存并生成Class对象

分类

  • 启动类加载器(Bootstrap ClassLoader):加载核心类库
  • 扩展类加载器(Extension ClassLoader):加载扩展类库
  • 应用程序类加载器(Application ClassLoader):加载程序员自己定义的类

Snipaste_2024-04-16_16-11-32.png

获取类加载器的方式

public ClassLoader getClassLoader() //返回该类的类加载器,启动类加载器的对象为null

双亲委派机制

3种加载器的关系

  1. 自定义类加载器的父级加载器为扩展类加载器
  2. 扩展类加载器的父级类加载器是启动类加载器

加载器的结论:这种关系称为类加载器的双亲委派模型

工作机制

  1. 某个"类加载器"收到类加载的请求,它首先不会尝试自己去加载这个类,而是把请求交给父级类加载器
  2. 因此,所有的类加载的请求最终都会传送到顶层的"启动类"加载器中
  3. 如果"父级类加载器"无法加载这个类,如何子级类加载器再去加载

类加载器的应用

加载配置文件并生成字节输入流
InputStream getResourceAsStream(“关联配置文件”)
结合Properties对象使用
注意:如果配置文件在src目录下,直接输入配置文件的文件名(相对路径,相对的是src目录)
代码如下:

public class Demo2 {
    public static void main(String[] args) throws IOException {

        //类对象
        Class aClass = Demo2.class;
        //根据类对象获取类加载器对象
        ClassLoader classLoader = aClass.getClassLoader();
        //根据类加载器对象,获取输入流
        InputStream is = classLoader.getResourceAsStream("user.properties");
        //创建Properties类
        Properties prop = new Properties();
        //prop读取is
        prop.load(is);
        //根据prop获取配置文件中的内容
        String name = prop.getProperty("name");
        System.out.println(name);
        int age = Integer.parseInt(prop.getProperty("age"));
        System.out.println(age);
    }
}

反射

概述

是运行时获取类的字节码文件对象,任何可以解析类中的全部成分

  • 反射是针对Class对象进行操作的
  • 是一种类的解剖技术(.class文件中书写有:构造方法,成员变量,成员方法)
    • 反射就可以获取.class文件中的构造方法,成员变量,成员方法
    • 获取到Constructor进行创建对象
    • 获取到Field进行赋值取值
    • 获取到Method可以调用方法执行

关键

得到编译以后的Class对象

获取类对象

  1. Class cls = Class.forName(“类的全限定名”);

类的全限定名:com.mysql.jdbc.Driver
要使用:Driver类
导入包:com.mysql.jdbc.Driver
编写代码:Driver driver = new Driver(); // 要求Driver类必须存在(如果Driver类不存在,代码报错)
Class.forName(“com.mysql.jdbc.Driver”);//不要求Driver类必须存在(不存在也不会报错)

  1. Class cls = 类名.class;

当在方法区中创建了.class文件的Class对象后,就可以使用

  1. Class cls = 对象名.getClass();

在创建具体的对象后,就可以通过对象名来获取Class对象
Snipaste_2024-04-16_17-04-20.png

获取构造器对象

通过类对象来获取Constructor
Snipaste_2024-04-16_17-09-15.png
11.png
获取私有构造器要想进行创建对象,在创建对象之前使用暴力破解即可
:继承中,父类的私有内容是可以继承的,但是由于java语言有权限过滤检查,所以不允许权限外的内容;Class对象总存储的private构造器,由于java语言有权限过滤检查,所以不允许访问私有构造器,而暴力破解可以设置本次访问暂时取消权限检查

获取方法对象

通过类对象获取Method
Snipaste_2024-04-16_18-19-52.png
Snipaste_2024-04-16_18-32-18.png
静态方法填null

获取成员变量对象

通过类对象获取Field
Snipaste_2024-04-16_18-44-49.png
Snipaste_2024-04-16_18-45-26.png

作用

  1. 在运行时得到一个类的全部成分任何操作
  2. 可以破坏封装性(很突出)
  3. 更重要的用途是适合:做Java高级框架
  4. 基本上主流框架都会基于反射设计一些通用技术功能

注解

概述

Annotation,对代码的描述,作为代码形式表示出来
单独使用没有任何意义,通常会结合反射技术一起使用

作用

可以书写在类、接口、自定义注解、构造器、成员方法、成员变量、参数
被注解标注的内容,可以实现一些特殊的作用(具体的作用以实际开发中的需求为准)

自定义注解

就是自己做一个注解来使用

格式

public @interface 注解名称 {
public 属性类型 属性名() default 默认值;
}

属性类型

  1. 八种基本数据类型
  2. String,Class,注解类型,枚举类
  3. 以上类型的一维数组形式

特殊属性

  • value属性,如果只有一个value属性的情况下,使用value属性的时候可以省略value名称不写,@UserService(“userService”)
  • 但是如果有多个属性,且多个属性没有默认值,那么value名称不能省略

元注解

书写在自定义注解上的注解(JDK提供的)

常见的元注解

  • @Target:约束自定义注解只能在哪些地方使用
  • @Retention:声明注解的生命周期

Snipaste_2024-04-16_20-08-43.png

注解解析

概述

注解中的操作中经常需要进行解析,注解的解析就是判断是否存在注解,存在注解就解析出内容

方法

s.png

技巧

  1. 判断某个位置上是否存在自定义注解
  2. 存在,对自定义注解进行解析

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Qt学习记录(C++)——Day 3

目录 一、封装自定义控件 1.添加界面类 2.添加控件 3.提升封装的控件 4.实现功能 5.提供接口 6.测试接口 二、鼠标事件 前言: 1.鼠标进入事件 enterEvent 2.鼠标离开事件 leaveEvent 3.鼠标按下事件 mousePressEvent 4.鼠标释放事件 mouseReleaseEv…

知识跟踪模型GraphKT

1 知识跟踪Knowledge Tracing的概念 知识跟踪可以用来解决自适应学习问题。如何通过与教学材料的在线互动来有效地跟踪学生的学习进展?知识跟踪可用于量化学生的知识状态,即对教材所涉及的技能掌握水平。用于评估和模拟学生随着时间推移对技能的认知掌握…

不借助第三方工具打包QT程序

准备工作: 项目/可执行文件名:QTAppName 打包项目存放的文件名:pack(这个文件名无所谓) 脚本名: copylib.sh(类似ldd命令):用于将.so库文件的依赖项复制并放入自动生…

docker拉取镜像速度慢

解决办法是配置阿里云镜像加速 在docker desktop的docker engine里添加 "registry-mirrors": ["https://owzy8hoh.mirror.aliyuncs.com"] 修改以后重启docker 参考: 【docker】Windows10系统下安装并配置阿里云镜像加速_docker desktop 配置…

Steam平台FPS游戏节来袭,速来免费领取头像、边框和贴纸

首先,活动时间从4月16日持续到4月23日,想领取免费物品的小伙伴们要抓紧时间啦!领取链接就在传送门等你哦。《战地》和《使命召唤》系列没有打折哦,有点遗憾。不过,别灰心,这次活动还是很给力的哦&#xff0…

Hyperledger Fabric

一.Hyperledger Fabric介绍 Hyperledger区块链全家桶 Hyperledger Fabric技术特性 资产 — 资产定义使得几乎任何具有货币价值的东西都可以在网络上交 换,包括从食品到古董汽车再到货币期货。链码 — 链码执行与交易排序的分离,限制了跨节点类型所需的…

Hibernate框架

什么是Hibernate 我们可以从度娘上摘抄这样有关Hibernate的介绍: Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO(简单java对象)与数据库表建立映射关系,是一个全自动的orm框架&…

【nnUNetv2进阶】四、nnUNetv2 魔改网络-小试牛刀-加入注意力机制ChannelAttention

nnUNet是一个自适应的深度学习框架,专为医学图像分割任务设计。以下是关于nnUNet的详细解释和特点: 自适应框架:nnUNet能够根据具体的医学图像分割任务自动调整模型结构、训练参数等,从而避免了繁琐的手工调参过程。 自动化流程&a…

LeetCode 80—— 删除有序数组中的重复项 II

阅读目录 1. 题目2. 解题思路3. 代码实现 1. 题目 2. 解题思路 让 index指向删除重复元素后数组的新长度;让 st_idx 指向重复元素的起始位置,而 i 指向重复元素的结束位置,duplicate_num代表重复元素的个数;一段重复元素结束后&am…

入侵检测数据预处理 特征工程 面临的问题

数据预处理 对于分类任务来说,由于原始数据可能存在异常、缺失值以及不同特征的取值范围差 异大等问题,对机器学习会产生影响,因此,在进行机器学习模型训练之前,需要先对数据 进行预处理。数据预处理的主要过程包括数据清洗、去量纲、离散化等。 1.数据清洗 对采集到的数据进行…

如何制作文字gif图?一键快速生成gif闪图

大家在聊天的过程中少不了使用gif表情包,但是大家知道这些gif动图怎么制作的吗?下面就来跟大家分享一下gif动图是如何制作的吧!其实,非常的简单无需下载软件只需要使用gif图片制作(https://www.gif5.net/)工…

QT creator 代码中有中文,提示常量中有换行符解决方案

QT creator 代码中有中文,提示常量中有换行符解决方案 参考视频问题问题解决 参考 感谢感谢,非常感谢,有你,让Qt不再困难,困扰我四年的问题解决了!!! https://blog.csdn.net/m0_45866718/article/details/112389513 视频 https://www.bilibili.com/video/BV1Fp4…

GitHub提交PR

本教程只做开源代码库Github工程提交pr的教程,不做其他的深入的讲解 Github和Gitlab的操作类似,只不过Github叫PR,GitLab叫MR,基本上做法是一致的 以开源项目QuickChat为例 https://github.com/Binx98/QuickChat https://github…

CAN网络管理(网络节点)

什么是CAN的网络节点 网络节点是指连接到CAN总线上的设备或模块,每个网络节点都具有唯一的标识符,称为节点ID,用于在CAN总线上进行通信和识别。 如何判断CAN的网络节点是多少 可以根据DBC来定义查看, 以ADCU为例,域控作为主节点,一般外部的像雷达,camera的数据都是向…

Yolo-world使用

1、安装 python pip install ultralytics 前往官网下载模型:https://docs.ultralytics.com/models/yolo-world/#key-features 我这里使用yolov8s-world.pt举例 最简单的使用示例 if __name__ __main__:model YOLO(model/yolov8s-world.pt)results model.pre…

JCVI-筛选blast最佳结果(生物信息学工具-015)

通常,大家会问我们经过了NR注释,SwissProt注释,那么如何进行,如何挑选最佳比对结果? 同理,存在一个问题,如何挑选最佳的blast比对结果?什么事最优的同源序列? 唐海宝老…

DBUtils工具类的使用

1、DBUtils是什么 为了更加简单地使用JDBC,Apache组织提供了一个DBUtils工具,它是操作数据库的一个组件,实现了对JDBC的简单封装,可以在不影响数据库访问性能的情况下简化JDBC的编码工作量。DBUtils工具要有2个作用。 写数据&am…

力扣周赛392复盘

3105. 最长的严格递增或递减子数组 题目 给你一个整数数组 nums 。 返回数组 nums 中 严格递增 或 严格递减 的最长非空子数组的长度。 思考: 返回什么:返回最长非空子数组的长度。return max(decs_len,incs_len); 但实际上我们只需要用一个变量ans就…

记录PS学习查漏补缺

PS学习 PS学习理论快捷键抠图PS专属多软件通用快捷键 PS学习 理论 JPEG (不带透明通道) PNG (带透明通道) 快捷键 抠图 抠图方式 魔棒工具 反选选中区域 CtrlShiftI(反选) 钢笔抠图注意事项 按着Ctrl单击节点 会出现当前节…

漫步密度森林:借助HDBSCAN实现高效数据聚类

文章来源:navigating-the-density-forest-harnessing-hdbscan-for-advanced-data-clustering 2024 年 4 月 9 日 介绍 在数据科学中,聚类算法是揭示数据集内在结构的重要工具。在这些工具中,基于分层密度的噪声应用空间聚类 (HDBSCAN) 作为…
最新文章