java引导类加载器_Java类加载器层次结构(一)

类加载器有一种父/子关系。除了引导类加载器外,每个类加载器都有一个父类加载器。本章通过分析ClassLoader的源码来展示java类加载器的层次结构。

根据规定,类加载器会为它的父类加载器提供一个机会,以便加载任何给定的类,并且只有在其父类加载器加载失败时,它才会加载该给定类。如:系统类加载器加载ArrayList类时,会首先让其父类加载器扩展类加载器进行加载,扩展类加载器会让其父类加载器引导类加载器进行加载,当其中任意一个加载器加载成功就返回Class对象。

e88c4d0f30b89b1e37ee5bdabf2503f2.png

ClassLoader的loadClass方法代码如下(这是jdk1.7的源码):protected Class> loadClass(String name, boolean resolve)

throws ClassNotFoundException

{

synchronized (getClassLoadingLock(name)) {

// First, check if the class has already been loaded

// 检查类是否已经被加载

Class c = findLoadedClass(name);

if (c == null) {

long t0 = System.nanoTime();

try {

if (parent != null) {

// 如果父类加载器不等于null,则使用父类加载器进行加载

c = parent.loadClass(name, false);

} else {

// 如果父类加载器等于null,则使用引导类加载器进行加载

c = findBootstrapClassOrNull(name);

}

} catch (ClassNotFoundException e) {

// ClassNotFoundException thrown if class not found

// from the non-null parent class loader

}

if (c == null) {

// If still not found, then invoke findClass in order

// to find the class.

long t1 = System.nanoTime();

// 如果该类加载器的所有父类加载器都没有加载成功,则使用当前类加载器进行加载

c = findClass(name);

// this is the defining class loader; record the stats

sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);

sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);

sun.misc.PerfCounter.getFindClasses().increment();

}

}

if (resolve) {

resolveClass(c);

}

return c;

}

}

某些程序具有插件的结构,通过配置文件指定动态的方式从jar文件中加载某个类,此时我们就可以使用URLClassLoader类加载器进行加载,如下:URL url = new URL("file:///D:/test/test.jar");

URLClassLoader myLoader = new URLClassLoader(new URL[]{ url});

Class> clazz = myLoader.loadClass("com.bug315.Test");

因为在URLClassLoader中没有指定父类加载器,因此URLClassLoader默认使用系统类加载器(AppClassLoader)作为父类加载器。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值