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

news2024/10/7 18:31:14

文章目录

  • 类的加载
    • 概述
    • 类加载器
      • 作用
      • 分类
      • 获取类加载器的方式
    • 双亲委派机制
      • 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.coloradmin.cn/o/1601011.html

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

相关文章

LabVIEW仪器信息管理系统

LabVIEW仪器信息管理系统 在计量检测实验室的日常工作中,仪器检定校准是一项基础而重要的任务。随着科技的进步和实验室工作量的增加,传统的人工管理方式已经难以满足现代实验室对效率和准确性的要求。开发一套基于LabVIEW的仪器信息管理系统显得尤为必…

还有同学开题报告没写吗?

引言 作为一名在软件技术领域深耕多年的专业人士,我不仅在软件开发和项目部署方面积累了丰富的实践经验,更以卓越的技术实力获得了🏅30项软件著作权证书的殊荣。这些成就不仅是对我的技术专长的肯定,也是对我的创新精神和专业承诺…

Jmeter 场景测试:登录--上传--下载--登出

为了练习Jmeter的使用,今天我要测试的场景是“登录--上传--下载--登出”这样一个过程. 测试的目标是我曾经练手写的一个文件分享系统,它要求用户只有登录后才可以下载想要的文件。 Jmeter总体结构: 第一步:添加HTTP Cookie管理器…

聊聊最近两星期的学习吧!

今天是4月14号。 自从我3月份回到学校之后,我每天都有记录自己的学习时长。今天晚上,我在复盘我自己学习时长的时候,我发现,在整个四月份,我平均每天的有效学习时长只有6h,而且到今天为止,整个四…

Java报表是什么?盘点2023最实用的四款Java报表

从字面义就可以推知,Java报表指的是在Java环境下开发或使用的报表工具。Java语言因其功能强大和简单易用的特点,是静态面向对象编程语言的代表,在Java环境开发使用的这些报表工具,可以通过提供可视化操作界面制作报表,…

最新的网易星球GEC挖矿系统修复版 章鱼星球挖矿系统源码 区块链虚拟币交易源码 基于ThinkPHP5开发

区块链系统介绍 2018.12.10更新增加聚合数据短信接口 2018.11.19更新增加短信宝接口 2018.08.17修复Linux系统搭建验证码不显示问题 2018.08.09修复后台某处溢出数据库账号密码BUG 2018.08.06修复票卷BUG 源码介绍: 区块链系统中用户共九个等级,依…

LabVIEW光学探测器板级检测系统

LabVIEW光学探测器板级检测系统 特种车辆乘员舱的灭火抑爆系统广泛采用光学探测技术来探测火情。光学探测器作为系统的关键部件,其探测灵敏度、响应速度和准确性直接关系到整个系统的运行效率和安全性。然而,光学探测器在长期使用过程中可能会因为灰尘污…

怎么用手机远程控制电脑 远程控制怎么用

怎么用手机远程控制电脑:远程控制怎么用 在这个科技日新月异的时代,远程控制电脑已经成为了很多人的需求。有时,我们可能在外出时突然需要访问家中的电脑,或者在工作中需要远程操控办公室的电脑。这时,如果能用手机远…

力扣:141. 环形链表

力扣:141. 环形链表 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾…

解决Linux根分区空间不足的方法:利用Home分区进行扩容

前言 在进行系统安装时,一个常见的困扰是默认分区设置可能导致home分区拥有过多的空间,而root分区却显得十分紧缺。这种情况下,用户往往会陷入无法继续安装软件或存储文件的困境。本文将向您展示如何通过合理的调整,将home分区中多…

贪吃蛇(C语言版--1)

在我们学完C语言之后 我们准备写一个贪吃蛇的代码 但在我们写贪吃蛇代码之前 我们需要铺垫一些数据结构的知识 顺序表基于顺序表实现通讯录项目单链表双向链表 顺序表(底层是数组) 顺序表其实是线性表(具有相同特性的数据结构的集合&…

【网络编程】UDP实现回显服务器

一.网络编程的基本术语. 客户端 客户端是为用户提供本地服务的程序,通常位于用户设备上。也称为用户端,是相对于服务器而言的。它主要指安装在用户设备上的程序,这些程序能够与服务器进行通信,从而获取服务或者执行特定功能。在…

window轻松使用k8s

Docker Desktop安装篇 1、win安装 1、下载安装包 https://www.docker.com/products/docker-desktop/ 官网下载安装包 2、配置win支持虚拟化 不勾选Hyper-V,它和Windows Subsystem for Linux (WSL) 是两套功能,这里不选他 3、安装WSL配置window支持lin…

6-pytorch - 网络的保存和提取

前言 我们训练好的网络,怎么保存和提取呢? 总不可以一直不关闭电脑吧,训练到一半,想结束到明天再来训练,这就需要进行网络的保存和提取了。 本文以前面博客3-pytorch搭建一个简单的前馈全连接层网络(回归问…

Level protection and deep learning

1.模拟生成的数据 import randomdef generate_data(level, num_samples):if level not in [2, 3, 4]:return Nonedata_list []for _ in range(num_samples):# 构建指定等级的数据data str(level)for _ in range(321):data str(random.randint(0, 9))data_list.append(data)…

2.4G漂移小车电子方案 酷得智能科技

漂移高速遥控车是一种专门设计用于执行高速漂移动作的遥控车模型。以下是一些关于漂移高速遥控车的功能介绍: 1、高速性能:漂移车通常配备有强力的电机和电池,以便在保持高速的同时进行漂移动作。 2、漂移能力:漂移车的轮胎和悬挂…

操作系统—实现可变式分区分配算法

文章目录 实现可变式分区分配算法1.实验环境2.如何在xv6中实现分区分配算法?(1).xv6的内存管理机制(2).实现思路 3.最佳适应算法(1).基本思路(2).步骤(3).测试&Debug 总结参考资料 实现可变式分区分配算法 1.实验环境 因为这一次的实验仍然是在xv6中进行&#…

【AIGC】AIGC在虚拟数字人中的应用:塑造未来互动体验的革新力量

🚀 🚀 🚀随着科技的快速发展,AIGC已经成为引领未来的重要力量。其中,AIGC在虚拟数字人领域的应用更是引起了广泛关注。虚拟数字人作为一种先进的数字化表达形式,结合了3D建模、动画技术、人工智能等多种先进…

PaddleOCR训练自己模型(2)----参数配置及训练

一、介绍 paddleocr分为文字定位(Det)和文字识别(Rec)两个部分 二、定位模型训练 (1)Det预训练模型下载:https://paddleocr.bj.bcebos.com/PP-OCRv4/chinese/ch_PP-OCRv4_det_train.tar (2)下载完之后,…

女上司问我:误删除PG百万条数据,可以闪回吗?

作者:IT邦德 中国DBA联盟(ACDU)成员,10余年DBA工作经验 擅长主流数据Oracle、MySQL、PG、openGauss运维 备份恢复,安装迁移,性能优化、故障应急处理等可提供技术业务: 1.DB故障处理/疑难杂症远程支援 2.Mysql/PG/Oracl…