初始化阶段解读
初始化阶段就是执行构造类加载器
()的过程
该方法不需要定义,是javac编译器自动收集类中所有类变量的赋值动作和静态代码中的语句合并而来
构造方法中指令按照语句在源文件出现的顺序执行
clinit() 不同于类的构造器
若该类具有父类,JVM会保证子类的clinit执行前,父类clinit已经执行完毕
虚拟机必须保证一个类clinit方法在多线程下被同步加锁 开发注意防止多线程抢占
// SystemClassLoaderClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();System.out.println(systemClassLoader); // sun.misc.Launcher$AppClassLoader@18b4aac2// ExtClassLoaderClassLoader extClassLoader = systemClassLoader.getParent();System.out.println(extClassLoader); // sun.misc.Launcher$ExtClassLoader@4554617c// BootStrapClassLoaderClassLoader bootStrapClassLoader = extClassLoader.getParent();System.out.println(bootStrapClassLoader); // null// 自定义类获取的就是 SystemClassLoaderClassLoader classLoader = Main.class.getClassLoader();System.out.println(classLoader); // sun.misc.Launcher$AppClassLoader@18b4aac2// 系统内置类型获取的是 BootStrapClassLoaderSystem.out.println(String.class.getClassLoader()); // null
// 方式一:通过当前类的ClassLoaderClassLoader classLoader = Class.forName("java.lang.String").getClassLoader();// 方式二:通过当前线程ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();// 方式三:通过系统的ClassLoaderClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();// 方式四:通过调用者DriverManager.getCallerClassLoader()
Java虚拟机对class文件采用的按需加载的方式,也就是说当需要使用该类时才会将它的class文件加载到内存生成class对象。而且加载某个类的class文件是,Java虚拟机采用的是双亲委派模式,即把请求交由父类处理,它是一种任务委派模式
优势