发表时间:2022-03-25来源:网络
Java之所以有平台无关性,是因为它自身带有一个虚拟机,只要有相应的环境配置就可以运行。而Java的程序都是在虚拟机中运行的,那么Java程序是怎么在虚拟机中加载运行的呢?下面,将为大家简单介绍一下Java虚拟中的类加载器,以及怎么加载的过程。

类加载子系统负责从文件系统或者网络中加载Class文件,Class文件在文件开头有特定的文件标识


字节码中的常量池加载到 方法区 -----> 运行时常量池信息



小补充:加载字节码文件(.class)的方式
本地系统直接加载 网络获取:Web Applet jar、war包 动态代理:运行时计算生成…验证(Verify)
目的在于确保Class文件的字节流中包含信息符合当前虚拟机要求,保证被加载类的正确性,不会危害虚拟机自身安全 主要包括四种验证:文件格式验证、元数据验证、字节码验证、符号引用验证准备(Prepare)
为类变量分配内存并且设置该类变量的默认初始值,即“零值”
(在准备阶段 a = 0,到下一个阶段(初始化阶段)a = 1)
(不同的数据类型的变量默认值不一样,如 int =0 ,引用类型 = null)
解析(Resolve)
将常量池内的符号引用转换为直接引用的过程 事实上,解析操作往往会伴随着JVM在执行完初始化之后再执行 符号引用:一组符号来描述所引用的目标。符号引用的字面量形式明确定义在《Java 虚拟机规范》的Class 文件格式中 直接引用:直接指向目标的指针、相对偏移量或者一个间接定位到目标的句柄 解析动作主要针对类或接口、字段、类方法、接口方法、方法类型等。对应常量池中的CONSTANT_Class_info、CONSTANT_Fieldref_info、CONSTANT_Methodref_info等。例子1:
public class Test { private static int a=2; private static int b=20; public static void main(String[] args) { System.out.println(a); System.out.println(b); } }
例子2:
public class Test { public static void main(String[] args) { System.out.println("测试一下"); } }

代码:
public class Test { public static void main(String[] args) { ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader(); System.out.println(systemClassLoader);//sun.misc.Launcher$AppClassLoader@18b4aac2 :应用类加载器 ClassLoader parent = systemClassLoader.getParent(); System.out.println(parent);//sun.misc.Launcher$ExtClassLoader@34a245ab :扩展类加载器 ClassLoader parent1 = parent.getParent(); System.out.println(parent1);//null :引导类加载器:非Java语言实现 ClassLoader classLoader = Test.class.getClassLoader(); System.out.println(classLoader);//sun.misc.Launcher$AppClassLoader@18b4aac2 ClassLoader classLoader1 = String.class.getClassLoader(); System.out.println(classLoader1);//null } }为什么要用自定义类加载器呢?
隔离加载类 修改类加载的方式 扩展加载源 防止源码泄漏用户自定义类加载器实现步骤
通过继承抽象类 java.lang.ClassLoader 类的方式,实现自己的类加载器,以满足一些特殊的需求 JDK1.2之前,总会去继承ClassLoader类并重写loadClass()方法,从而实现自定义的类加载器,但是在JDK1.2之后,已不再建议去覆盖loadClass()方法,而是建议把自定义的类加载逻辑写在 findClass()方法中 如果对于类加载器没有太过于复杂的需求,可以通过直接继承 URLClassLoader类,这样就可以避免自己去编写findClass()方法及其获取字节码流的方式,使自定义类加载器编写更加简洁
继承体系

获取 ClassLoader

Java 虚拟机对class文件采用的是按需加载的方式,也就是说当需要使用该类时才会将它的class文件加载到内存生成class对象。而且加载某个类的class文件时,Java虚拟机采用的双亲委派模式,即把请求交由父类处理,它是一种任务委派模式

优势
避免类的重复加载 保护程序安全,防止核心API被随意篡改:自定义:java.lang.String … 不要乱取包名在JVM中表示两个class对象是否为同一个类存在两个必要条件
类的全限定类名必须一致,包括包名 加载这个类的ClassLoader(指ClassLoader实例对象)必须相同 即使两个类来源于同一个文件,但是类加载器不一样,那这两个类对象也是不相等的以上就是关于Java虚拟机中的类加载器以及类加载全过程的详细内容,想要了解更多关于Java虚拟机中类加载的内容,可以多多关注W3Cschool相关文章内容。如果您觉得本篇文章还不错,还希望大家能够多多支持!
皓盘云建最新版下载v9.0 安卓版
53.38MB |商务办公
ris云客移动销售系统最新版下载v1.1.25 安卓手机版
42.71M |商务办公
粤语翻译帮app下载v1.1.1 安卓版
60.01MB |生活服务
人生笔记app官方版下载v1.19.4 安卓版
125.88MB |系统工具
萝卜笔记app下载v1.1.6 安卓版
46.29MB |生活服务
贯联商户端app下载v6.1.8 安卓版
12.54MB |商务办公
jotmo笔记app下载v2.30.0 安卓版
50.06MB |系统工具
鑫钜出行共享汽车app下载v1.5.2
44.7M |生活服务
2022-03-26
2022-03-26
2022-03-26
2022-03-26
2022-03-26
2022-03-26
2022-03-26
2022-03-26
2022-02-15
2022-02-14