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

文章目录

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows停掉jenkins服务

在Windows系统中,如果你需要停止Jenkins服务, 使用服务管理器(Service Manager): 打开“运行”对话框(Win R),输入services.msc,然后回车。 在服务列表中找到“Jenkins”服务&am…

财务软件行业背景-易舟云

财税是每个企业的基本基石之一。财务报告讲述了公司的故事——它的利润和亏损、收益和债务、税收支出以及可用于未来增长的资产。随着信息时代的飞速发展,财务信息化建设日益完善,大量基于计算机网络的应用系统已经逐步深入财务管理领域。传统的会计录入…

1102: 顺序表上数据的划分问题的实现

解法&#xff1a; #include<iostream> #include<vector> #include<stack> #include<queue> using namespace std; int main() {int n;cin >> n;vector<int> arr(n);stack<int> stk;queue<int> que;for (auto& x : arr) c…

【多线程】阻塞队列 | put()方法 | take()方法 | 生产者-消费者模式 |实现阻塞队列

文章目录 阻塞队列1.生产者-消费者模式生产者消费者模型的意义&#xff1a;1.解耦合2.削峰填谷&#xff1a; 2.阻塞队列的使用BlockingQueue 3.实现阻塞队列唤醒&#xff1a;使用阻塞队列实现生产者消费者模型 阻塞队列 阻塞队列是一种特殊的队列&#xff1a; 1.是线程安全的。…

linux管理进程

一、程序 程序&#xff1a;执行特定任务的一串代码 1.是一组计算机能识别和执行的指令&#xff0c;运行于电子计算机上&#xff0c;满足人们某种需求的信息化工具 2.用于描述进程要完成的功能&#xff0c;是控制进程执行的指令集 二、进程和线程 1.进程 进程是程序的执行…

CSS导读 (CSS的背景 上)

&#xff08;大家好&#xff0c;今天我们将继续来学习CSS的相关知识&#xff0c;大家可以在评论区进行互动答疑哦~加油&#xff01;&#x1f495;&#xff09; 目录 四、CSS的背景 4.1 背景颜色 4.2 背景图片 4.3 背景平铺 4.4 背景图片位置 4.4.1 参数是方位名词 …

[蓝桥杯 2019 国 B] 解谜游戏

[蓝桥杯 2019 国 B] 解谜游戏 题目背景 题目描述 小明正在玩一款解谜游戏。谜题由 24 24 24 根塑料棒组成&#xff0c;其中黄色塑料棒 4 4 4 根&#xff0c;红色 8 8 8 根&#xff0c;绿色 12 12 12 根 (后面用 Y 表示黄色、R 表示红色、G 表示绿色)。初始时这些塑料棒排…

代码随想录刷题随记23-回溯3

代码随想录刷题随记23-回溯3 39. 组合总和 leetcode链接 注意同一个 数字可以 无限制重复被选取 怎么体现这个可以重复取的思想很重要 解题代码&#xff1a; class Solution { public:void backtrace( vector<vector<int>>& ret,vector<int> &pat…

鸿蒙端云一体化开发--调用云函数--适合小白体制

如何实现在端侧调用云函数&#xff1f; 观看前&#xff0c;友情提示&#xff1a; 不知道《如何一键创建端云一体化模板》的小白同学&#xff0c;请看&#xff1a; 鸿蒙端云一体化开发--开发云函数--适合小白体制-CSDN博客 实现方法&#xff1a; 第一步&#xff1a;添加依赖 …

android studio 网络请求okhttp3、okgo

一、在build.gradle文件里添加 implementation com.squareup.okhttp3:okhttp:4.9.0 implementation com.squareup.okhttp3:okhttp:3.12.0 implementation com.squareup.okio:okio:1.17.4 implementation com.lzy.net:okgo:3.0.4 implementation com.alibaba:fastjson:1.2.57 i…

Linux之 USB驱动框架-usb-skeleton.c usb驱动源码分析(3)

一、usb 驱动框架图 二、 usb 设备经典驱动&#xff1a;usb-skeleton.c 驱动 路径&#xff1a; drivers/usb/usb-skeleton.c USB骨架程序可以看做一个最简单的USB设备驱动的实例&#xff0c;其分析流程大致如下&#xff1a; static struct usb_driver skel_driver { …

hot100 -- 链表(中)

不要觉得力扣核心代码模式麻烦&#xff0c;它确实比不上ACM模式舒服&#xff0c;可以自己处理输入输出 只是你对 链表 和 return 的理解不到位 &#x1f442; ▶ 屿前世 (163.com) &#x1f442; ▶ see you tomorrow (163.com) 目录 &#x1f382;两数相加 &#x1f6a9;删…