类加载器、反射、注解

1、类加载器

1.1类加载器作用

        负责将.class文件(存储的物理文件)加载在到内存中。

 1.2类加载的过程

类加载时机

  • 创建类的实例(对象)
  • 调用类的类方法
  • 访问类或者接口的类变量,或者为该类变量赋值
  • 使用反射方式来强制创建某个类或接口对应的java.lang.Class对象
  • 初始化某个类的子类
  • 直接使用java.exe命令来运行某个主类

类加载过程

i. 加载

  • 通过包名 + 类名,获取这个类,准备用流进行传输
  • 在这个类加载到内存中
  • 加载完毕创建一个class对象

 ii. 链接

验证--确保Class文件字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身安 全 (文件中的信息是否符合虚拟机规范有没有安全隐患)

准备--负责为类的类变量(被static修饰的变量)分配内存,并设置默认初始化值 (初始化静态变量)

解析--将类的二进制数据流中的符号引用替换为直接引用 (本类中如果用到了其他类,此时就需要找到对应的类)

 iii. 初始化--根据程序员通过程序制定的主观计划去初始化类变量和其他资源 (静态变量赋值以及初始化其他资源)

 当一个类被使用的时候,才会加载到内存---类加载的过程: 加载、验证、准备、解析、初始化。

1.3类加载的分类

分类

  • Bootstrap class loader:虚拟机的内置类加载器,通常表示为null ,并且没有父null
  • Platform class loader:平台类加载器,负责加载JDK中一些特殊的模块
  • System class loader:系统类加载器,负责加载用户类路径上所指定的类库

类加载器的继承关系---System的父加载器为Platform Platform的父加载器为Bootstrap。

1.4 ClassLoader 中的两个方法

方法名说明
public static ClassLoader getSystemClassLoader()获取系统类加载器
public InputStream getResourceAsStream(String name)加载某一个资源文件

2.反射

2.1 反射的概述

反射机制---是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法; 对于任意一个对象,都能够调用它的任意属性和方法; 这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。

2.2获取Class类对象的三种方式

三种方式分类

  • 类名.class属性
  • 对象名.getClass()方法
  • Class.forName(全类名)方法

 获取里面的构造方法对象

getConstructor (Class... parameterTypes) getDeclaredConstructor (Class... parameterTypes)

如果是public的,直接创建对象

newInstance(Object... initargs)

如果是非public的,需要临时取消检查,然后再创建对象

setAccessible(boolean) 暴力反射

2.3反射获取成员变量

反射和配置文件优化

 Class类获取成员变量对象的方法

方法名说明
Field[] getFields()返回所有公共成员变量对象的数组
Field[] getDeclaredFields()返回所有成员变量对象的数组
Field getField(String name)返回单个公共成员变量对象
Field getDeclaredField(String name)返回单个成员变量对象

2.4 Field类用于给成员变量赋值的方法

方法名说明
void set(Object obj, Object value)赋值
Object get(Object obj)获取值

2.5 反射获取成员方法

方法名 说明
Method[] getMethods()返回所有公共成员方法对象的数组, 包括继承的
Method[] getDeclaredMethods()返回所有成员方法对象的数组, 不包括继承的
Method getMethod(String name, Class... parameterTypes)返回单个公共成员方法对象
Method getDeclaredMethod(String name, Class... parameterTypes)返回单个成员方法对象

2.6 Method类用于执行方法

方法名说明
Object invoke(Object obj, Object... args)运行方法

2.7 反射机制常见的使用场景

  1. 动态创建对象:在运行时,根据类名字符串动态创建对象实例。
  2. 访问私有成员:通过反射可以访问类中私有的字段和方法,尽管这通常不被推荐,因为它违反了封装原则。
  3. 获取类的结构信息:获取类的所有属性和方法信息,包括私有的属性和方法。
  4. 动态调用方法:在运行时调用对象的方法,特别是当方法名是动态决定的时候。
  5. 设计灵活的代码:编写可以在运行时适应不同类型对象的代码,提高代码的通用性和灵活性。
  6. 实现工厂模式:使用反射来实现基于类的名称来创建对象的简单工厂模式。
  7. 实现依赖注入:许多现代Java框架(如Spring)使用反射来自动装配依赖。
  8. 创建代理:动态代理模式利用反射来创建代理类,以拦截和处理方法调用。
  9. 注解处理:Java的注解处理器在编译时使用反射读取注解信息。
  10. 实现单元测试:在测试框架中,反射可以用于测试私有方法或模拟对象。
  11. 实现ORM框架:对象关系映射(ORM)框架,如Hibernate,使用反射来自动映射数据库表到Java对象。
  12. 自定义类加载器:通过反射实现自定义类加载器,以动态加载字节码。
  13. 序列化和反序列化:某些序列化机制可能使用反射来读取对象的状态。
  14. 实现事件监听机制:事件监听器模式可能会使用反射来动态地注册和处理事件。
  15. 动态配置:应用程序可以根据配置文件动态地加载和使用不同的类。

3.注解

3.1概述

对我们的程序进行标注和解释

 注解和注释的区别

  • 注释: 给程序员看的
  • 注解: 给编译器看的

使用注解进行配置配置的优势,代码更加简洁,方便。

 3.2 自定义注解

格式:

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

属性类型

  • 基本数据类型
  • String
  • Class
  • 注解
  • 枚举
  • 以上类型的一维数组

 3.3 元注解

元注解就是描述注解的注解;

元注解介绍

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

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

相关文章

Java学习 (一) 环境安装及入门程序

一、安装java环境 1、获取软件包 https://www.oracle.com/java/technologies/downloads/ .exe 文件一路装过去就行,最好别装c盘 ,我这里演示的时候是云主机只有C盘 2、配置环境变量 我的电脑--右键属性--高级系统设置--环境变量 在环境变量中添加如下配…

数字孪生涉及到的9大技术栈,都是难啃骨头呀。

数字孪生涉及到多个技术栈,包括但不限于以下几个方面: 数据采集和传感器技术: 数字孪生需要实时获取物理世界的数据,因此需要使用各种传感器技术(如温度传感器、压力传感器、运动传感器等)来采集数据&…

RedHat运维-Linux文本操作基础-GREP,AWK,SED基础

你不用整理,跟着敲一遍,有个印象,然后把它保存到本地,以后要用再去看,如果有了新东西,你自个再添加。这是我参考同行的,只不过换成了问答的方式而已。不用背,就算是我自己亲自敲&…

【猫狗分类】Pytorch VGG16 实现猫狗分类1-数据清洗+制作标签文件

Pytorch 猫狗分类 用Pytorch框架,实现分类问题,好像是学习了一些基础知识后的一个小项目阶段,通过这个分类问题,可以知道整个pytorch的工作流程是什么,会了一个分类,那就可以解决其他的分类问题&#xff0…

第6章 设备驱动程序(3)

目录 6.5 块设备操作 6.5.1 块设备的表示 6.5.2 数据结构 6.5.3 向系统添加磁盘和分区 6.5.4 打开块设备文件 本专栏文章将有70篇左右,欢迎关注,查看后续文章。 6.5 块设备操作 特点: 随机访问任意位置。 固定块大小的传输。 块设备在内…

手机网站制作软件是哪些

手机网站制作软件是一种用于设计、开发和创建适用于移动设备的网站的软件工具。随着移动互联网时代的到来,越来越多的用户开始使用手机浏览网页和进行在线交流,因此,手机网站制作软件也逐渐成为了市场上的热门工具。 1. Adobe Dreamweaver&am…

【FFmpeg】AVCodec结构体

【FFmpeg】AVCodec结构体 1. AVCodec的定义2. AVCodec内结构体嵌套2.1 enum AVMediaType type2.2 enum AVCodecID id2.3 const AVRational *supported_framerates2.4 const enum AVPixelFormat *pix_fmts2.5 const AVClass *priv_class2.6 const AVProfile *profiles 参考&…

[240619] 2024年 curl 用户调研和分析 | 英伟达成为全球市值第一的公司

目录 2024年 curl 用户调研和分析调研说明调研概述调查数据结果 英伟达成为市值第一的公司 2024年 curl 用户调研和分析 调研说明 关于 curl : curl 是一个成熟的开源项目,提供 curl 工具和 libcurl 库。是世界上使用最广泛的命令行软件之一。调查背景 : 本次为11…

天翼云8080、80端口用不了的问题

天翼云8080、80端口用不了的问题 前言:前段时间天翼云搞了活动,原来公司用的华为云老板说太贵了也快到期了,就换了天翼云的服务器。 排查: 安全组开放 80 8080 防火墙查看 没有问题 nginx nacos dcoker等停了 查看监听端口 发现…

YOLOv10改进 | 注意力篇 | YOLOv10引入HAttention(HAT)注意力

1. HAT介绍 1.1 摘要:基于 Transformer 的方法在低级视觉任务(例如图像超分辨率)中表现出了令人印象深刻的性能。 然而,我们发现这些网络通过归因分析只能利用有限的输入信息空间范围。 这意味着 Transformer 的潜力在现有网络中仍未得到充分发挥。 为了激活更多的输入像素…

国际现货黄金的交易方式:二次入场机会识别

近期受地缘局势以及通胀因素的影响,国际现货黄金投资又重新受到市场的青睐。虽然近期金价出现大跌,但投资者反而认为这是低价买金的好机会。为了方便投资者做出决策,下面我们就介绍一些国际现货黄金的交易方式——二次入场点进场。 在国际现货…

探索高效和轻量级多模态大语言模型的奥秘

过去一年,多模态大语言模型(MLLM)在视觉问答、视觉理解和推理等任务中表现出色。然而,模型的庞大尺寸和训练推理的高成本限制了其在学术界和工业界的广泛应用。因此,研究高效和轻量级的MLLM具有重要意义,尤其是在边缘计算场景中。…

Graphviz——实现动态更新协议状态机

1、描述 为了实现动态更新协议状态机,首先需要定义类来表示协议状态机。初始化该类后,保存状态机对象。在后续更新过程中,就可以加载保存的状态机对象,添加新的状态或事件。Graphviz的安装过程参考:Graphviz——安装、…

ECharts 雷达图案例002 - 诈骗性质分析

ECharts 雷达图案例002 - 诈骗性质分析 📊 ECharts 雷达图案例002 - 诈骗性质分析 深入挖掘数据背后的故事,用可视化手段揭示诈骗行为的模式和趋势。 🔍 案例亮点 创新的数据展示方式,让复杂的诈骗数据一目了然。定制化的雷达图…

一文带你入门【论文排版】利器·LaTeX |Macos

小罗碎碎念 我在刚开始写公众号的时候,写过一期推文,详细的讲解过如何使用LaTeX快速的进行论文排版。不过当时用的是windows的系统,这一次把Mac端的教程补上。 windows系统教程 https://zhuanlan.zhihu.com/p/677481269 LaTeX是一种流行的排…

「AIGC」 华为CodeArts Snap详解

华为的 CodeArts Snap 是一款集成了人工智能技术的编程辅助工具,旨在帮助开发者提高编码效率和代码质量。以下是对 CodeArts Snap 技术详解,以及一个简单的代码案例,帮助初学者更好地理解其功能。 技术详解 CodeArts Snap 主要功能包括: 代码生成:根据开发者的自然语言描…

Python10 python多线程

1.什么是python多线程 Python的多线程指的是在一个Python程序中同时运行多个线程,以达到并发执行多个任务的目的。线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。 在Python中,多线程的…

将xlsx电子表格中所有sheet合并在一起

import pandas as pd # 打开xlsx文件 xlsx pd.ExcelFile(path_to_your_file.xlsx) # 读取所有sheets到一个list中 sheets [] for sheet in xlsx.sheet_names: sheets.append(xlsx.parse(sheet)) # 合并所有sheets combined pd.concat(sheets) # 将合并后的数据写入新…

昇思25天学习打卡营第1天 | 快速入门

内容介绍:通过MindSpore的API来快速实现一个简单的深度学习模型。 具体内容: 1. 导包 import mindspore from mindspore import nn from mindspore.dataset import vision, transforms from mindspore.dataset import MnistDataset 2. 处理数据 fro…

如何快速使用向量检索服务DashVector?

免费体验阿里云高性能向量检索服务:https://www.aliyun.com/product/ai/dashvector 本文将介绍如何快速上手使用向量检索服务DashVector。 前提条件 已创建Cluster:创建Cluster。 已获得API-KEY:API-KEY管理。 已安装最新版SDK&#xff1a…