java类加载器总结


java中可以有多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader,AppClassLoader



类加载器也是Java类,因为其他是java类的类加载器本身也要被类加载器加载,显然必须有第一个类加载器不是不是java类,这正是BootStrap。

BootStrap是存在于jvm内核中 由c++语言编写的

一.当Java虚拟机要加载一类时,到底派出哪个类加载器去加载呢?

首先当前线程的类加载器去加载线程中的第一个类。
如果类A中引用了类B,Java虚拟机将使用加载类A的类加载器来加载类B。
还可以直接调用ClassLoader.loadClass()方法来指定某个类加载器去加载某个类。(这不是静态方法,是ClassLoader的一个实例调用loadClass方法)

二.类加载器的委托机制
当一个类加载器需要加载一个类时,不会首先自己加载,而是委托给上级加载,上级在自己的目录下找不到该类,才会一级级往下.
当回到发起者时依然找不到该类 则会抛出 ClassNotFoundException
例如AppClassLoader要加载一个类,会首先委托给ExtClassLoader,ExtClassLoader再委托给BootStrap.

所以即使我们自己写了一个java.lang.System 但是加载时,因为委托机制,首先会由BootStrap去加载java系统提供的System类.

三.自定义类加载器
1.自定义的类加载器必须继承ClassLoader.
ClassLoader(ClassLoader parent)的构造函数中可以指定用于委托操作的父类加载器.也可以使用空参构造,那么会默认使用getSystemClassLoader() 返回的作为父类加载器

2.不需要复写loadClass()方法,只要复写findClass()方法即可.
因为loadClass()方法会执行委托加载的操作,如果复写了,则需要我们自己去定义委托加载.
在API的描述中也鼓励程序员复写findClass(String )而不是protected Class<?> loadClass( String name,boolean resolve)
 
 
自定义的加载器可以写入解密方法来加载经过我们加密的class.而用系统默认的加载器则无法加载.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值