JAVA中类加载器浅析

 

类加载器可能将网络上的、或者内存中地 .class文件读取到内存中,并生成class对象,同一类不会被加载第二次。JVM依据同一包名+类名的方式判断当前类是否已经加载。如果相同的类名分布在不同的包下面,JVM会分别加载这两个类,但是生成的对象不同。

 

组成:

在JVM启动的时候,会由启动类加载器BootstrapClassLoader、扩展类加载器Extension ClassLoader、系统类加载器App ClassLoader​​​​​三部分组成初始类加载器。

 

关系:

父子级  =   启动类加载器 > 扩展类加载器 > 系统类加载器

 

加载机制:

他们都采取向上传递的机制,即有了要加载的类,先问问自己的父加载器,若父加载器不能加载,自己再加载

 

1. 启动类加载器BootstrapClassLoader

基于JVM核心的启动器,它会加载java.lang.ClassLoader以及其他的java平台类,当启动类加载器开始运行时,会加载扩展类加载器系统类加载器。类似于整个程序的启动钥匙,所以,启动类加载器加载的并非JAVA类,反之其他加载器加载的都是JAVA类

package com.shtec.classLoader;
import sun.misc.Launcher;

public class JvmClassLoaderTest {
    public static void main(String[] args) {
        
        //ClassLoader是由启动类加载器加载的
        System.out.println(ClassLoader.class.getClassLoader());//null
        
        //Launcher内部定义了系统和扩展类加载器,为null,说明系统和扩展类加载器是由启动类加载器加载的
        System.out.println(Launcher.class.getClassLoader());//null
    }
}

2、扩展类加载器Extension ClassLoader:

扩展类加载器只能加载jar包中的内容(ZIP),加载都是基础的文件

3、系统类加载器App ClassLoader:

第三方jar包和自己编写java文件

package classLoader.com.liuyahui;

public class ClassLoaderTest {
	
	public static void main(String[] args) {
		
		System.out.println(ClassLoaderTest.class.getClassLoader());

        // 打印自己编写的一个测试类,结果为AppClassLoader,证明系统类加载器加载的为自己的代买文件
        // sun.misc.Launcher$AppClassLoader@73d16e93
		
	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值