时间:2021-05-02
为什么要使用类加载器?
java语言里,类加载都是在程序运行期间完成的,这种策略虽然会令类加载时稍微增加一些性能开销,但是会给java应用程序提供高度的灵活性。例如:
1.编写一个面向接口的应用程序,可能等到运行时再指定其实现的子类;
2.用户可以自定义一个类加载器,让程序在运行时从网络或其他地方加载一个二进制流作为程序代码的一部分;(这个是android插件化,动态安装更新apk的基础)
为什么研究类加载全过程?
类加载机制
jvm把class文件加载到内存,并对数据进行校验、解析和初始化,最终形成jvm可以直接使用的java类型的全过程。
加载
将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区中的运行时数据结构,在堆中生成一个代表这个类的java.lang.class对象,作为方法区类数据的访问入口,这个过程需要类加载器参与。
链接
将java类的二进制代码合并到jvm的运行状态之中的过程
初始化
例1:
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 public class demo01 { public static void main(string[] args) { a a = new a(); system.out.println(a.width); } } class a{ public static int width=100; //静态变量,静态域 field static{ system.out.println("静态初始化类a"); width = 300 ; } public a() { system.out.println("创建a类的对象"); } }分析:
说明:
内存中存在栈、堆(放创建好的对象)、方法区(实际也是一种特殊堆)
1、jvm加载demo01时候,首先在方法区中形成demo01类对应静态数据(类变量、类方法、代码…),同时在堆里面也会形成java.lang.class对象(反射对象),代表demo01类,通过对象可以访问到类二进制结构。然后加载变量a类信息,同时也会在堆里面形成a对象,代表a类。
2、main方法执行时会在栈里面形成main方法栈帧,一个方法对应一个栈帧。如果main方法调用了别的方法,会在栈里面挨个往里压,main方法里面有个局部变量a类型的a,一开始a值为null,通过new调用类a的构造器,栈里面生成a()方法同时堆里面生成a对象,然后把a对象地址付给栈中的a,此时a拥有a对象地址。
3、当调用a.width时,调用方法区数据。
当类被引用的加载,类只会加载一次
类的主动引用(一定会发生类的初始化)
类的被动引用(不会发生类的初始化)
例2:
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 public class demo01 { static{ system.out.println("静态初始化demo01"); } public static void main(string[] args) throws exception { system.out.println("demo01的main方法!"); system.out.println(system.getproperty("java.class.path")); //主动引用 // new a(); // system.out.println(a.width); // class.forname("com.sinosoft.test.a"); //被动引用 // system.out.println(a.max); // a[] as = new a[10]; system.out.println(b.width);//b类不会被加载 } } class b extends a { static { system.out.println("静态初始化b"); } } class a extends a_father { public static int width=100; //静态变量,静态域 field public static final int max=100; static { system.out.println("静态初始化类a"); width=300; } public a(){ system.out.println("创建a类的对象"); } } class a_father extends object { static { system.out.println("静态初始化a_father"); } }总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。
原文链接:https://juejin.im/post/5addb276f265da0b9c103e42
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
类加载机制java类从被加载到JVM到卸载出JVM,整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、
系统可能在第一次使用某个类时加载该类,也可能采用预加载机制来加载某个类。本节将会详细介绍类加载、连接和初始化过程中的每个细节。JVM和类当调用java命令运行某
一、先看看编写出的代码的执行过程:二、研究类加载机制的意义从上图可以看出,类加载是Java程序运行的第一步,研究类的加载有助于了解JVM执行过程,并指导开发者采
类加载器java类加载器就是在运行时在JVM中动态地加载所需的类,java类加载器基于三个机制:委托,可见,单一。把classpath下的那些.class文件加
framework就像是JVM,没有JVM所有java程序无法运行,没有.NetFramework所有依赖于与该框架的程序也无法运行,比如说Winform程序,