一、加载:
java.lang.Class
对象,作为方法区这个类的各种数据访问入口加载.class文件的方式
二、链接:
三、初始化
<clinit>()
的过程<clinit>()
不同于类的构造器。(关联:构造器是虚拟机视角下的<init>()
)<clinit>()
执行前,父类的<clinit>()
已经执行完毕<clinit>()
方法在多线程下被同步加锁类加载器的分类 1、启动类加载器(引导类加载器,Bootstrap ClassLoader)
JAVA——HOME/jar/lib/rt.jar
、resource.jar
或sun.boot.class.path
路径下的内容),用于提供JVM自身需要的类java.lang.ClassLoader
,并没有父加载器Bootstrap
启动类加载器只加载包名为java、javax、sum
等开头的类2、扩展类加载器(Extension ClassLoader
)
ClassLoader
类java.ext.dirs
系统属性所指定的目录中加载类库,或从JDK的安装目录的jre/lib/ext
子目录下加载类库3、应用程序类加载器(系统类加载器,AppClassLoader
)
ClassLoader
类classpath
或系统属性,java.class.path
指定路径下的类库ClassLoader.getSystemClassLoader();
方法可以获取到该类加载器// 获取系统类加载器 --> Application ClassLoader
ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
// jdk.internal.loader.ClassLoaders$AppClassLoader@2437c6dc
System.out.println(systemClassLoader);
// 获取其上层:扩展类加载器 --> Extension ClassLoader
ClassLoader systemClassLoaderParent = systemClassLoader.getParent();
// jdk.internal.loader.ClassLoaders$PlatformClassLoader@4c203ea1
System.out.println(systemClassLoaderParent);
// 获取其上层:获取不到引导类加载器 --> Bootstrap ClassLoader
ClassLoader systemClassLoaderParentParent = systemClassLoaderParent.getParent();
System.out.println(systemClassLoaderParentParent);
// 获取用户自定义的类加载器:默认使用系统类加载器进行加载
ClassLoader classLoader = ClassLoaderTest.class.getClassLoader();
// jdk.internal.loader.ClassLoaders$AppClassLoader@2437c6dc
System.out.println(classLoader);
// String 是由引导类加载器加载的 --> 系统核心类库都是由引导类加载器加载
ClassLoader classLoader1 = String.class.getClassLoader();
System.out.println(classLoader1);
自定义类加载器
在什么情况下 需要自定义的加载器? 1、隔离加载器 2、修改类加载方式 3、拓展加载类 4、防止源码泄露
双亲委派机制 工作原理:
双亲委派机制
优势:
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有