反射之类加载器详解和委托加载

本文深入探讨了Java类加载器的工作原理,通过具体代码示例解释了不同类型的类加载器及其层级关系,并介绍了如何实现自定义类加载器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



 父类加载器。

下面用例子进行说明如:

public class ClassLoaderTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		System.out.println(
				ClassLoaderTest.class.getClassLoader().getClass().getName()
				);
		System.out.println(
				System.class.getClassLoader()
				);
}

 

sun.misc.Launcher$AppClassLoader
null

 为什么System为null?这是因为此类事由BootStrap装载器装载,这个装载器是java虚拟机内核写的(用C写的二进制),所有无法有java得到

二、如何得到类加载器之间的关系?

下面的图示类加载器之间的关系图




 
 用代码如何得到他们之间的关系呢?

ClassLoader classLoader=ClassLoaderTest.class.getClassLoader();
        while(classLoader!=null){
            System.out.println(classLoader.getClass().getName());
            classLoader=classLoader.getParent();
        }
        System.out.println(classLoader);

 打印的结果:

 

   sun.misc.Launcher$AppClassLoader
sun.misc.Launcher$ExtClassLoader
null

 先是从子类进行打印然后再到父类,直到BootStrap类加载器

介绍java JDK下的jar文件:如

C:\Program Files\Java\jdk1.6.0_02\jre\lib下有rt.jar文件时JavaAPI中一些容器的类等等,C:\Program Files\Java\jdk1.6.0_02\jre\lib\ext目录是扩展的包,如果产生的jar文件可以放在这个目录下

提出一个问题就是如何让自己编译出来的jar文件,只需要加载通过类加载器

ExtClassLoader不需要AppClassLoader呢?
这样只需要在此类中(Myeclipse下)右击鼠标点击导出,然后选择java->jar文件后,把此类放到jre\lib\ext目录下()

然后上面的代码运行的情况是:

sun.misc.Launcher$ExtClassLoader
null

那为什么ClassLoderTest.class文件不先加载到AppClassLoader加载器呢?

                   先看看实例图


如何写自己的类加载器那就需要自己的类需要继承ClassLoader,而ClassLoader的构造函数有一个参数就是自己的类加载器是挂靠在哪个父节点上.详细查看API

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值