Java-类加载

news2024/11/17 6:53:22

静态加载和动态加载

在这里插入图片描述
4种加载时机,只有反射是动态加载
在这里插入图片描述

静态加载举个例子
Cat父类Animal
mao是Cat类独有方法

Animal a=new Cat();
a.mao();//编译看左边
//左边类型为Animal(会加载Animal类,编译时进行加载叫静态加载)
//然后加载Animal类的时候,Animal里面没有mao方法就会报错

在这里插入图片描述
比如这个图中可能输入的不是1
Dog类也会加载,因为Dog类是静态加载

反射->动态加载
而我们的Person就是动态加载,只有在运行到它的时候加载
就是当这个输入是2运行到了
Class.forName()才会加载

静态加载就是只要没有你写的类就报错

动态加载就是执行到需要加载类的部分发现没有对应的类,然后报错

类加载流程图

在这里插入图片描述
在这里插入图片描述

类加载的五个个阶段
加载-验证-准备-解析-初始化
下面会一一讲解

类加载五个阶段

加载阶段

在这里插入图片描述
就是把class文件的二进制数据加载到方法区
同时在堆中生成一个对应的Class对象
他们之间是相互关联的

连接阶段

验证

在这里插入图片描述
这个Dog.class文件就是cafebabe开头,合法的class文件
在这里插入图片描述
3.加这个开关可以降低类验证阶段效率的降低
值检测一些类验证措施

准备

在这里插入图片描述
就是在准备阶段-对静态变量进行默认赋值
不同类型的变量有不同的分配内存和赋值方式

实例变量是不进行内存分配的-这也是为什么,静态方法中不能使用实例变量

静态变量先赋默认值(0,false等),不会先赋定义的值!

而final static 比较特殊,它不会赋默认的值,而是会在准备阶段直接赋我们定义的值,之后就不变了
在这里插入图片描述

解析

在这里插入图片描述

虚拟机将常量池的符号引用转为直接引用的过程

可以理解为刚开始A类写一个1应用到B类写一个2
可以理解为一种符号引用

然后我们类加载要分配内存,再具体分配对应的引用

先搭个框架,然后把具体的引用放进去
没必要了解太深

初始化阶段

在这里插入图片描述
需要了解的是这个初始化阶段还是只处理静态的代码/变量

class B{
	static{
	System.out.println("B静态代码块被执行");
	num = 300;
	}
	static int num=100;
	public B(){System.out.println("B()构造器被执行");}
	
}
这样写-可能认为是错的,因为静态代码如果前后执行是不是就是num先赋值300
然后再进行的定义static int num = 100;
而其实我们的num在连接阶段以及分配内存并且赋了初值
所以num=300和num=100其实都相当于赋值操作
然后比如我们子另一个类中
new B();
会怎么输出呢-一步一步看
加载阶段-生成Class对象和在方法区生成二进制文件
连接阶段-把我们的num = 0;(赋默认值)
初始化阶段-按前后顺序收集并合并静态代码/语句
相当于运行了
<clinit>(

	System.out.println("B静态代码块被执行");
	num = 300;
	num=100;
)
然后介绍构造器执行
如果只调用静态属性就不会调用构造器

3.加载类的时候有一个同步机制控制,只有一个线程能在同一时间加载同一个类
源码
在这里插入图片描述
防止在堆里同时产生多个Class对象

通过反射获取类的结构信息

class对象获取

在这里插入图片描述

演示代码

package yuan.hsp.reflection.Class;

import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Iterator;

//常用方法进行一个类的信息获取
@SuppressWarnings({"all"})
public class structget {
	public static void main(String[] args) throws ClassNotFoundException {
		//1.得到class对象-forName,前面有好多得到类名的方法
		Class cls = Class.forName("yuan.hsp.reflection.Class.Person");
		//2.getName:获取全类名
		System.out.println(cls.getName());
		//3.getSimpleName:获取简单类名
		System.out.println(cls.getSimpleName());
		//4.getFields:获取所有public修饰的属性,包含父类以及本类的
		Field[] fields = cls.getFields();
		for(Field aField:fields) {
			System.out.println("public本类属性和父类的"+aField.getName());
		}
		//5.getDeclaredFields:获取本类的所有属性
		Field[] declaredFields = cls.getDeclaredFields();
		for(Field bField:declaredFields) {
			System.out.println("本类所有属性"+bField.getName());
		}
		//6.getMethods:获取所有的public修饰的方法,包含本类以及父类的
		Method[] methods = cls.getMethods();
		for(Method cMethod:methods) {
			System.out.println("public本类和父类方法"+cMethod.getName());
		}
		
		//7.getDeclaredMethods:获取本类的所有方法
		Method[] declaredMethods = cls.getDeclaredMethods();
		for(Method dMethod:declaredMethods) {
			System.out.println("本类所有方法"+dMethod.getName());
		}
		
		//8.getConstructors:获取所有public修饰构造器,包含本类
		Constructor[] constructors = cls.getConstructors();
		for(Constructor e:constructors) {
		System.out.println("获取public构造器本类"+e.getName());
		}
		//9.getDeclaredConstructors:获取本类所有构造器
		Constructor[] declaredConstructors = cls.getDeclaredConstructors();
		for(Constructor g:declaredConstructors) {
			System.out.println("本类的所有构造器"+g.getName());
		}
		//10.getPackage:以Package形式返回包信息
		System.out.println(cls.getPackageName());
		//11.getSuperClass:以Class形式返回父类信息
		System.out.println("父类Class对象获取简单类名"+cls.getSuperclass().getSimpleName());
		//12.getInterfaces:以Class[]返回接口信息
		Class[] interfaces = cls.getInterfaces();
		for(Class h:interfaces) {
			System.out.println("接口"+h.getSimpleName());
		}
		//13.getAnnotations:以Annotation[]形式返回注解信息
	  Annotation[] annotations = cls.getAnnotations();
	  for(Annotation i:annotations) {
		  System.out.println("注解"+i);
	  }
	}

}

class A{
	public String hobby;
	public void hi() {
		
	}
	
}
interface B{}
interface C{}
@SuppressWarnings({"all"})
@Deprecated
class Person extends A implements B,C{
	public String name;
	protected int age;
	String job;
	private double salary;
	public Person(){
		
	}
	public Person(String name) {
		
	}
	public void m1() {
		
	}
	protected void m2() {
		
	}
	void m3(){
		
	}
	private void m4() {
		
	}
	
	
}


运行结果
yuan.hsp.reflection.Class.Person
Person
public本类属性和父类的name
public本类属性和父类的hobby
本类所有属性name
本类所有属性age
本类所有属性job
本类所有属性salary
public本类和父类方法m1
public本类和父类方法hi
public本类和父类方法wait
public本类和父类方法wait
public本类和父类方法wait
public本类和父类方法equals
public本类和父类方法toString
public本类和父类方法hashCode
public本类和父类方法getClass
public本类和父类方法notify
public本类和父类方法notifyAll
本类所有方法m2
本类所有方法m1
本类所有方法m3
本类所有方法m4
获取public构造器本类yuan.hsp.reflection.Class.Person
获取public构造器本类yuan.hsp.reflection.Class.Person
本类的所有构造器yuan.hsp.reflection.Class.Person
本类的所有构造器yuan.hsp.reflection.Class.Person
yuan.hsp.reflection.Class
父类Class对象获取简单类名A
接口B
接口C
注解@java.lang.Deprecated(forRemoval=false, since="")

Field类获取

在这里插入图片描述
在这里插入图片描述

Method类获取

在这里插入图片描述
在这里插入图片描述

Constructor类获取

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

OpenShift 容器平台企业版 OCP 4.11.9 部署(基于KVM,CentOS)

参考&#xff1a; 阿里云上Openshift-4.10.5搭建 OpenShift4.8在oVirt下的自动化安装 红帽OpenShift安装部署-阿里云帮助中心 安装配置操作节点&#xff08;Operator&#xff09;&#xff0c;并获取OCP离线安装文件 OCP安装定制文件准备_frank0521的博客-CSDN博客 第 23 章…

【Java数据结构与算法】第二十一章 元组

【Java数据结构与算法】第二十一章 元组 文章目录【Java数据结构与算法】第二十一章 元组1.概念2.自定义元组3.第三方Jar包1.概念 元组&#xff08;Tuple&#xff09;是一种数据结构&#xff0c;可以存放多个元素&#xff0c;每个元素的数据类型可以不同。用List与Tuple类比&a…

深入了解Netty,这一篇就够了

一、Netty简介 Netty是由JBOSS提供的一个java开源框架&#xff0c;现为 Github上的独立项目。Netty提供异步的、事件驱动的网络应用程序框架和工具&#xff0c;用以快速开发高性能、高可靠性的网络服务器和客户端程序。 也就是说&#xff0c;Netty 是一个基于NIO的客户、服务器…

微分方程(人口预测+传染病模型)

一、定义 微分方程&#xff1a;含导数或微分的方程 微分方程的阶数&#xff1a;所含导数或微分的最高阶数&#xff0c;如y’’’2y’’-2x0是三阶微分方程 微分方程的解&#xff1a;使得微分方程成立的函数 例如y’-2x0的解可以为x或者x1 微分方程的通解和特解&#xff1a;特…

【pat】分而治之【图】

分而治之&#xff0c;各个击破是兵家常用的策略之一。在战争中&#xff0c;我们希望首先攻下敌方的部分城市&#xff0c;使其剩余的城市变成孤立无援&#xff0c;然后再分头各个击破。为此参谋部提供了若干打击方案。本题就请你编写程序&#xff0c;判断每个方案的可行性。输入…

MySQL触发器相关知识

1、什么是触发器 触发器&#xff08;trigger&#xff09;是mysql的数据库对象之一&#xff0c;是一种与表操作有关的数据库对象&#xff0c;当触发器所在表上出现指定事件时&#xff08;这些事件包括insert、update、delete三种&#xff09;&#xff0c;将调用该对象&#xff0…

2023年安装Flutter开发环境_在C盘空间占用空间

2023年安装Flutter开发环境&#xff0c;C盘空间还剩多少&#xff1f; 1&#xff1a;Flutter开发对磁盘空间的要求 2&#xff1a;其余日常辅助软件安装D盘&#xff08;占用8GB&#xff09; 3&#xff1a;消耗时间&#xff08;3天–网络有时会中断&#xff09;–【劝退提示】 安…

Hudi(12):Hudi集成Flink之sql-client方式

目录 0. 相关文章链接 1. 启动sql-client 1.1. 修改flink-conf.yaml配置 1.2. local模式 1.3. yarn-session模式 2. 插入数据 3. 查询数据 4. 更新数据 5. 流式插入 5.1. 创建测试表 5.2. 执行插入 5.3. 查看job 5.4. 查看job 5.5. 查看HDFS目录 5.6. 查询结果 …

行为型模式 - 解释器模式Interpreter

学习而来&#xff0c;代码是自己敲的。也有些自己的理解在里边&#xff0c;有问题希望大家指出。 模式的定义与特点 解释器模式&#xff08;Interperter Pattern&#xff09;&#xff0c;给定一个语言&#xff0c;定义它的文法表示&#xff0c;并定义一个解释器&#xff0c;这个…

智引未来,深兰科技机器人家族首次亮相TechG

12月31日&#xff0c;首届上海国际消费电子技术展(简称TechG)在南京国际博览中心圆满落下帷幕。作为全球消费电子技术领域的顶级行业盛会&#xff0c;本届展会共吸引了来自全球的300余家企业出席&#xff0c;共计逾2万名专业人士到场参观。阿里巴巴、蚂蚁科技、海尔、科大讯飞、…

PyQt6快速入门-菜单与工具栏

菜单与工具栏 接下来我们将了解一些常见的用户界面元素,您可能在许多其他应用程序中都见过它们——工具栏和菜单。 我们还将介绍Qt 提供的用于最小化不同 UI 区域之间的重复的整洁系统 — QAction。 1、Toolbars 最常见的用户界面元素之一是工具栏。 工具栏是用于在应用程序…

【微服务】Nacos 账号权限体系

目录 一、背景 1、账号体系 2、账号实体映射 二、方案 1、Nacos 资源模型 2、Nacos 授权 resource 2.1、授权 resource 组成 2.2、不同级别授权资源组成 3、Nacos 授权 Opers 4、Nacos 具体权限定义 4.1、Opers 组成 4.2、具体实例 4.3、工程实现 三、RBAC 设计实…

IDEA使用Spring initializr 创建SpringBoot项目超时问题解决办法

1.问题描述 IDEA使用Spring initializr 创建SpringBoot项目时经常会出现连接超时的问题&#xff0c;报错提示如下 还有一个提示非常简短就是 connect timed out 总之问题都是一样&#xff0c;可能因为是外网所以有时候会出现连接问题&#xff0c;多试几次会成功&#xff0c;…

AutoScraper——爬虫神器

AutoScraper是一个自动化的爬虫工具&#xff0c;非常智能&#xff0c;而且使用简单便捷。AutoScraper 是使用 Python 实现的 Web 爬虫&#xff0c;兼容 Python 3&#xff0c;能快速且智能获取指定网站上的数据&#xff0c;在github上具有4.8K⭐️。github链接&#xff1a;https…

有哪些你看了以后大呼过瘾的计算机书籍?

推荐几本让程序员们爱不释手的经典书。 1、代码整洁之道 鲍勃大叔作品&#xff0c;程序员&#xff0c;汇聚编程数十年编程生涯的心得体会&#xff0c;阐释如何解决软件开发人员、项目经理及软件项目领导们所面临的棘手的问题。 本书提出一种观点&#xff1a;代码质量与其整洁…

Qt+C/C++文章小说人物关系分析

程序示例精选 QtC文章小说人物关系分析 如需安装运行环境或远程调试&#xff0c;见文章底部微信名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<QtC/C文章小说人物关系分析>>编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易…

浅谈未来跨境电商发展的新趋势?

从21世纪初&#xff0c;互联网在我国应运而生&#xff0c;并且在国家政策的倾斜和互联网的渗透下&#xff0c;结合互联网商业巨头对全球互联网产业的优化布局&#xff0c;互联网技术逐渐得到完善&#xff0c;伴随着近年来直播带货以及互联网电商的加持&#xff0c;我国的线上购…

Crack:dhtmlx JavaScript UI Libraries 商业企业版

dhtmlx JavaScript UI Libraries 企业版 包含Ω578867473&#xff1a; JS Gantt Chart JS Scheduler JS UI Widgets Library JS Diagram Library JS Kanban Board JS To Do List JS Event Calendar JS Spreadsheet JS Pivot Table JS File Uploader JS Rich Text Editor Gantt…

家庭库存管理系统Homebox

本文完成于 2022 年的 10 月&#xff0c; 最近正好有网友在找这方面的软件&#xff0c;就给翻出来了&#xff1b;Homebox 通过存储位置和标签两个维度来管理物品&#xff0c;非常简单易用&#xff0c;希望能满足要求&#xff1b; 什么是 Homebox &#xff1f; Homebox 是一个自…

TensorFlow和PyTorch的实际应用比较

TensorFlow和PyTorch是两个最受欢迎的开源深度学习框架&#xff0c;这两个框架都为构建和训练深度学习模型提供了广泛的功能&#xff0c;并已被研发社区广泛采用。但是作为用户&#xff0c;我们一直想知道哪种框架最适合我们自己特定项目&#xff0c;所以在本文与其他文章的特性…