接着,加载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
- 梁文道:这是做读书节目以来,最想给观众介绍的一本书 中国十大禁书剪灯夜话
- 世界级都市排行榜:纽约、洛杉矶领衔,上海、北京崭露头角 世界十大地标建筑
- 世界上最高的两座电视塔,一座在日本,一座在中国,你说哪座好看 世界十大电视塔
- 国内排不上名的大学,被美国制裁后,一举成为世界名校 中国十大名气下降大学
- 行业第一!八马茶业登顶2023中国顾客满意度指数榜首 中国十大茶叶连锁店
- 盘点身价过亿的10位女明星:一个比一个有钱,你知道几个? 中国最富的十大女明星
- 马云被四部门联合约谈 双十一红包每天三次怎么领
- 近期超火的5款免费APP,你都用过哪一款? 免费下载中国之最伴奏
- 忻州长城:四项全国第一、十项全国唯一! 中国之最长城排名
- 它是中国西部第一条商业步行街,街上有这么一座地标,必须瞻仰 中国之最步行街