JAVA - 深入JAVA 虚拟机 2

Posted dawangandy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA - 深入JAVA 虚拟机 2相关的知识,希望对你有一定的参考价值。

类的两种类型的类加载器

-Java虚拟机自带的加载器

  根类加载器(Bootstrap): 使用C++编写,programer can not abtain this class.

   扩展类加载器(Extension): 使用Java代码实现

  系统类加载器(System):使用Java代码实现

 

-用户自定义的类加载器

  java.lang.ClassLoader的子类:  (public abstract class ClassLoader)

  用户可以定制类的加载方式:

 


package practise;

public class TestClassLoader {
    
    public static void main(String[] args) {
        Class clz=null;
        try {
            clz = Class.forName("java.lang.String");
            System.out.println(clz.getClassLoader());
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        Class clz2=null;
        
        try {
            clz2 = Class.forName("practise.c");
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
                
        System.out.println(clz2.getClassLoader());
        
    }

}

class c{
    
    
}
null ---> 这个说明这个是根类加载器
sun.misc.Launcher$AppClassLoader@73d16e93 --->这个说明是应用加载器

 

JVM规范允许类加载器在预料某个类将要被使用时就预先加载它,如果在预先加载的过程中遇到了.class

文件缺失或者存在错误,类加载器必须在程序首次主动使用该类时才报告错误。

 

类被加载后,就进入连接阶段,连接就是将已经读入到内存的类的二进制数据合并到虚拟机的运行时环境中去

 

类的验证的内容:

  -类文件的结果检查

  -语义检查

  -字节码验证

  -二进制兼容性的验证

 

类的准备阶段

类的解析

 类的初始化

类的初始化步骤:

package practise;

import java.util.Random;

class StaticBlock{
    
    public static final int x = new Random().nextInt(100);
    
    static{
        
        System.out.println("This is finaltest static block");
    }
}

public class FinalTest {
    
    public static void main(String[] args) {
        System.out.println(StaticBlock.x);
    }

}

Result:
This is finaltest static block
82


package practise;

class StaticBlock2{
    
    public static final int x = 6/3;
    
    static{
        
        System.out.println("This is finaltest static block");
    }
}

public class FinalTest2 {
    
    public static void main(String[] args) {
        System.out.println(StaticBlock2.x);
    }

}

Result:
2
如果是常量,StaticBlock2不会被初始化,所以上面的static块不会被执行

 

以上是关于JAVA - 深入JAVA 虚拟机 2的主要内容,如果未能解决你的问题,请参考以下文章

深入理解Java虚拟机——方法调用(解析调用)

深入理解java虚拟机

重读《深入理解Java虚拟机》虚拟机如何加载Class文件

深入理解Java虚拟机——方法调用(静态分派调用)

深入理解Java虚拟机的目录

深入Java虚拟机——Java体系结构