一、JVM和Java体系结构( 八 )


接着,加载ple类,执行它的静态代码块,输出"ple静态代码块1"和"ple静态代码块2",然后初始化静态变量的值为2 。
最后,在主函数中输出静态变量的值,输出结果为"静态变量的值为:1" 。
3、类加载器分类
JVM支持两种类型的类加载器,分别为引导类加载器( )附自定义类加载器(User- ) 。
从概念上来讲,自定义类加载器一般指的是程序中由开发人员自定义的一类类加载器,但是Java虚拟机规范却没有这么定义,而是将所有派生于抽象类的类加载器都划分为自定义类加载器 。
无论类加载器的类型如何划分,在程序中我们最常见的类加载器始终只有3个,如下所示:
package com.lxg.java1;/*** @author shkstart* @create 2020 上午 9:22*/public class ClassLoaderTest {public static void main(String[] args) {//获取系统类加载器ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();System.out.println(systemClassLoader);//sun.misc.Launcher$AppClassLoader@18b4aac2//获取其上层:扩展类加载器ClassLoader extClassLoader = systemClassLoader.getParent();System.out.println(extClassLoader);//sun.misc.Launcher$ExtClassLoader@1540e19d//获取其上层:获取不到引导类加载器ClassLoader bootstrapClassLoader = extClassLoader.getParent();System.out.println(bootstrapClassLoader);//null//对于用户自定义类来说:默认使用系统类加载器进行加载ClassLoader classLoader = ClassLoaderTest.class.getClassLoader();System.out.println(classLoader);//sun.misc.Launcher$AppClassLoader@18b4aac2//String类使用引导类加载器进行加载的 。---> Java的核心类库都是使用引导类加载器进行加载的 。ClassLoader classLoader1 = String.class.getClassLoader();System.out.println(classLoader1);//null}}
3.1、虚拟机自带的加载器
启动类加载器(引导类加载器, )
**扩展类加载器(** )
应用程序类加载器(系统类加载器,)
package com.lxg.java1;/*package com.lxg.java1;import sun.security.ec.CurveDB;import java.net.URL;import java.security.Provider;*/import sun.security.ec.ECKeyFactory;import sun.security.util.CurveDB;import java.net.URL;import java.security.Provider;/*** @author shkstart* @create 2020 上午 12:02*/public class ClassLoaderTest1 {public static void main(String[] args) {System.out.println("**********启动类加载器**************");//获取BootstrapClassLoader能够加载的api的路径URL[] urLs = sun.misc.Launcher.getBootstrapClassPath().getURLs();for (URL element : urLs) {System.out.println(element.toExternalForm());}//从上面的路径中随意选择一个类,来看看他的类加载器是什么:引导类加载器ClassLoader classLoader = Provider.class.getClassLoader();System.out.println(classLoader);//nullSystem.out.println("***********扩展类加载器*************");String extDirs = System.getProperty("java.ext.dirs");for (String path : extDirs.split(";")) {System.out.println(path);}//从上面的路径中随意选择一个类,来看看他的类加载器是什么:扩展类加载器ClassLoader classLoader1 = ECKeyFactory.class.getClassLoader();System.out.println(classLoader1);//sun.misc.Launcher$ExtClassLoader@1b6d3586}}
用户自定义类加载器
为什么要自定义类加载器?
用户自定义类加载器实现步骤:
开发人员可以通过继承抽象类java.lang.类的方式,实现自己的类加载器,以满足一些特殊的需求
在JDK1.2之前,在自定义类加载器时,总会去继承类并重写()方法,从而实现自定义的类加载类,但是在JDK1.2之后已不再建议用户去覆盖()方法,而是建议把自定义的类加载逻辑写在()方法中
package com.lxg.java1;import java.io.FileNotFoundException;/*** 自定义用户类加载器* @author shkstart* @create 2019 下午 12:21*/public class CustomClassLoader extends ClassLoader {@Overrideprotected Class