JVM加载类知识点
来源:互联网 发布:洲际导弹 知乎 编辑:程序博客网 时间:2024/06/05 03:58
一、JVM类加载过程
JVM将类加载过程分为三个步骤:装载(Load),链接(Link,又分为验证、准备、解析三个步骤)和初始化(Initialize)。
1) 装载:查找并加载类的二进制数据;
2)链接:
验证:校验加载类的正确性;
准备:为类的静态变量分配内存,并将其初始化为默认值;
解析:把类中的符号引用转换为直接引用;
3)初始化:为类的静态变量赋予正确的初始值;
二、JVM加载类的三种方式
1.通过new关键字加载
Object example=new Object();
2.通过ClassLoader实例的loadClass方法加载
ClassLoader loader = ClassLoader.getSystemClassLoader();Class exampleClass=loader.loadClass("Example");Object example =exampleClass.newInstance();
3.通过Class.forName加载
Class exampleClass = Class.forName("Example");Object example =exampleClass.newInstance();
三、加载类三种方式的区别:
1. new关键字加载(第1种)和Class.forName(第2种)加载使用的类加载器是是当前类加载器,即this.getClass.getClassLoader。ClassLoader(第3种)由用户指定类加载器。如果需要在当前类路径以外寻找类,则只能采用ClassLoader方式;
2. 第1种加载方式为静态加载,第2种和第3种加载方式为动态加载,即在运行时加载;
3. 第1、2加载方式将加载类的static内容,第3种方式不加载。因为第1、2种方式会一直执行至初始化(Initialize)过程,而第3种方式执行装载(Load)过程后即终止,不完成链接和初始化过程。
//Class.forName(String className) 源码 public static Class<?> forName(String className) throws ClassNotFoundException { Class<?> caller = Reflection.getCallerClass(); return forName0(className, true, ClassLoader.getClassLoader(caller), caller); } //第二个参数是指Class被loading后是不是必须被初始化。 不初始化就是不执行static的代码即静态代码
//ClassLoader.loadClass(className)实际上调用的是ClassLoader.loadClass(name, false),第二个参数指出Class是否被link。
例如:
//定义Point类public class Point {static{System.out.println("Point静态内容");}}
//测试public class ClassLoaderTest {public static void main(String[] args) {loaderTest();forNameTest();}private static void loaderTest() {System.out.println("===测试ClassLoader====:");ClassLoader loader = ClassLoader.getSystemClassLoader();Class<?> point = null;try {point = loader.loadClass("classLoader.Point");} catch (Exception e) {e.printStackTrace();}}private static void forNameTest() {System.out.println("===测试ForName====:");try {Class<?> point = Class.forName("classLoader.Point");} catch (Exception e) {e.printStackTrace();}}}//执行结果://===测试ClassLoader====://===测试ForName====://Point静态内容
4. 静态加载方式如果出现类没有找到,将抛出NoClassDefFoundError,Error的子类,而第2、3种方式将抛出ClassNotFoundException检测异常(Checked Exception);
0 0
- JVM加载类知识点
- 【JVM】JVM类加载机制
- JVM类加载1-加载
- jvm类加载过程
- JVM类加载
- JVM 类加载过程
- jvm :类加载原理
- JVM加载类详情
- JVM类加载器
- JVM类加载器
- JVM类加载,详谈
- JVM加载类原理
- jvm类加载机制
- JVM类加载机制
- JVM-类加载机制
- JVM类加载机制
- JVM类加载机制
- jvm 类加载器
- java键盘输入/屏幕输出练习
- Java反射机制
- 每日论文 Learning from Simulated and Unsupervised Images through Adversarial Training
- 编写一个Java程序,创建制定长度的int型数组,并生成100以内的随机数为数组的每个元素赋值
- 蓝桥杯 垒骰子(矩阵快速幂)
- JVM加载类知识点
- 华为oj中级 字符串运用-密码截取
- 圆形进度条
- log4cplus编译出静态库liblog4cplus.a
- 蓝桥杯-和并石子--区间DP
- 回溯法解决N皇后问题(以四皇后为例)
- Jason Zhang Genting Live Concert Lucky Draw(Concert Lucky Draw, iBET lucky draw, iBET online casino,
- 悲催的 击键项目 ------ quick hit
- (ssl1613)最短路径问题