上一篇博客简要的提了一下java反射机制中涉及到的一些相关知识,那么ClassLoader就是当中之中的一个。本篇博客就具体的对ClassLoader做一个相对深入的了解。

作为了解须要知道的是。事实上类类型(Class Class)是和ClassLoader分不开的。由于ClassLoader须要的信息是由它提供的。类类型将在下一篇博客介绍。

简单介绍

ClassLoader是负责载入类的对象。作用是依据Jvm请求提供的类信息。将请求的类载入的内存中或者说载入到Jvm中。

另外,每个类的Class对象(注意Class是类类型)都持有一个相应的ClassLoader的引用。

能够通过Class对象的getClassLoader()方法得到。类和它的ClassLoader是相应的。所以类仅仅能通过它相应的ClassLoader载入。

    注意:数组类的 Class 对象不是由类载入器创建的。而是由 Java 执行时依据须要自己主动创建。数组类的类载入器由 Class.getClassLoader() 返回,该载入器与其元素类型的类载入器是同样的;假设该元素类型是基本类型,则该数组类没有类载入器。

分类

JVM在执行时会产生三个ClassLoader。Bootstrap ClassLoader、Extension ClassLoader和App ClassLoader。

    Bootstrap ClassLoader:是用C++编写的,是JVM的内置载入器,它的名字是null。它用来载入核心类库,即在lib下的类库。做个实验。首先,String类肯定是java的核心类。那我们就以它为例来看看:

public static void main(String[] args){
String a="x";
System.out.println(a.getClass().getClassLoader());
}

我们通过代码来获得String载入相应的ClassLoader的名字输出的结果为NULL。

    Extension ClassLoader:载入lib/ext下的类库。

    App ClassLoader:载入Classpath里的类库。

层次关系

之前我们说过,每个Class对象都会持有一个相应的ClassLoader的引用。每个ClassLoader对象也会持有一个Parent ClassLoader的引用。这里须要特别注意的是:这里所指的的Parent ClassLoader不是我们熟悉的继承关系,不是父类。!

首先。我们要知道这里说的是ClassLoader对象,也就是说这的Parent
ClassLoader事实上是一个对象的引用。以下看一张图。了解一下ClassLoader对象之间的层次关系:

     

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemh1b2ppYWppbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

我们这里能够在做一个实验,来体会一下这个层次关系。代码例如以下:

         

public static void main(String[] args){
ClassLoader c =TestClassLoader.class.getClassLoader();
do {
System.out.println(c.getClass().getName());
c=c.getParent();
}while(c!=null);
}
}

输出的结果为:

sun.misc.Launcher$AppClassLoader

sun.misc.Launcher$ExtClassLoader

双亲载入机制

层次关系中我们了解到了非常重要的一点:载入器对象之间的引用关系。被引用的对象称之为引用对象的父载入器。可以通过getParent()方法得到。

那么双亲载入机制就是基于这样的引用的层次关系。即:当一个ClassLoader接到请求时,它不是直接载入相应的类。而是询问它引用的ClassLoader是否可以载入。而这个父ClassLoader则会询问自己的引用的ClassLoader是否载入了该类。

仅仅有当全部的父ClassLoader都没有载入该类时,这个最初的ClassLoader才自己去载入申请的类。

非常绕啊,文字说不清楚还是上图吧。

双亲载入机制能够一定程度上保证安全性,由于仅仅要顶层ClassLoader能载入的东西就一定不会让下层的ClassLoader有机会载入。

也就保证了有些自己定义的带有破坏性的类不会被载入到Jvm核心中。

    结语:ClassLoader相对难理解的地方一个是,对象将的层次关系和父载入器。还有一个是双亲载入机制。

这里提供一个视频供大家參考。

java反射机制剖析(二)— Class Loader的更多相关文章

  1. Java反射机制剖析(二)-功能以及举例

    从<java反射机制剖析(一)>的API我们看到了许多接口和类,我们能够通过这些接口做些什么呢? 从上篇API中我们能看到它能够完成下面的这些功能: 1)     获得类 A.     运 ...

  2. Java反射机制剖析(三)-简单谈谈动态代理

    通过Java反射机制剖析(一)和Java反射机制剖析(二)的学习,已经对反射有了一定的了解,这一篇通过动态代理的例子来进一步学习反射机制. 1.     代理模式 代理模式就是为其他对象提供一种代理来 ...

  3. Java反射机制剖析(四)-深度剖析动态代理原理及总结

    动态代理类原理(示例代码参见java反射机制剖析(三)) a)  理解上面的动态代理示例流程 a)  理解上面的动态代理示例流程 b)  代理接口实现类源代码剖析 咱们一起来剖析一下代理实现类($Pr ...

  4. Java反射机制剖析(一)-定义和API

    1.     什么是Java反射机制 Java的反射机制是在程序运行时,能够完全知道任何一个类,及其它的属性和方法,并且能够任意调用一个对象的属性和方法.这种运行时的动态获取就是Java的反射机制.其 ...

  5. 【54】Java反射机制剖析

    java反射机制: 1.指的是可以于运行时加载,探知和使用编译期间完全未知的类. 2.程序在运行状态中, 可以动态加载一个只有名称的类, 对于任意一个已经加载的类,都能够知道这个类的所有属性和方法; ...

  6. 菜鸟学Java(十五)——Java反射机制(二)

    上一篇博文<菜鸟学编程(九)——Java反射机制(一)>里面,向大家介绍了什么是Java的反射机制,以及Java的反射机制有什么用.上一篇比较偏重理论,理论的东西给人讲出来总感觉虚无缥缈, ...

  7. Java反射机制(二):通过反射取得类的结构

    在反射运用过程中,如果你想得到一个类的完整结构,那么就要使用到java.lang.reflect包中的几个类: · Constructor  表示类中的构造方法 · Field  表示类中的属性 · ...

  8. Java 反射机制(二)

    <Core Java Volume I --- Fundamentals>介绍了三种创建Class对象的方法.本文将举例说明这三种创建Class对象---创建类的方法. 一.public ...

  9. 菜鸟学Java(十四)——Java反射机制(一)

    说到反射,相信有过编程经验的人都不会陌生.反射机制让Java变得更加的灵活.反射机制在Java的众多特性中是非常重要的一个.下面就让我们一点一点了解它是怎么一回事. 什么是反射 在运行状态中,对于任意 ...

随机推荐

  1. [HAOI2015]树上染色(树形dp)

    [HAOI2015]树上染色 题目描述 有一棵点数为 N 的树,树边有边权.给你一个在 0~ N 之内的正整数 K ,你要在这棵树中选择 K个点,将其染成黑色,并将其他 的N-K个点染成白色 . 将所 ...

  2. HTTP——状态码

    (转载) 完整的 HTTP 1.1规范说明书来自于RFC 2616,你可以在http://www.talentdigger.cn/home/link.php?url=d3d3LnJmYy1lZGl0b ...

  3. hadoop-08-关闭THP服务

    hadoop-08-关闭THP服务 #查看THP服务cat /sys/kernel/mm/redhat_transparent_hugepage/enabledcat /sys/kernel/mm/r ...

  4. POJ--1966--Cable TV Network【无向图顶点连通度】

    链接:http://poj.org/problem?id=1966 题意:一个无向图,n个点,m条边,求此图的顶点连通度. 思路:顶点连通度,即最小割点集里的割点数目.一般求无向图顶点连通度的方法是转 ...

  5. a+=b 等价于 a=a+b ?

    a += b和a = a + b全然等价么(java)?可能非常多人以为是一样的,事实上并不是等价的,以下看一下证据吧. public class Test { public static void ...

  6. iOS 中client和server的 Web Service 网络通信 (1)

    当你打开你手机上新浪微博应用或者知乎应用是.你是否会去想这些显示在手机上的图片和数据时从哪里来的?又是通过如何的方法实现的?好.那么接下来就介绍是如何实现的.过程又是怎么样的.      当我们浏览着 ...

  7. Android 经常使用工作命令mmm,mm,m,croot,cgrep,jgrep,resgrep,godir

    官方定义: Invoke ". build/envsetup.sh" from your shell to add the following functions to your ...

  8. bzoj3931: [CQOI2015]网络吞吐量(spfa+网络流)

    3931: [CQOI2015]网络吞吐量 题目:传送门 题解: 现在有点难受....跳了一个多钟...菜啊... 题意都把做法一起给了....最短路+网路流啊. 不想说话...记得开long lon ...

  9. zzulioj--1827--石锅全拌(区间求和水题)

    1827: 石锅全拌 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 6  Solved: 3 SubmitStatusWeb Board Descri ...

  10. 48.AngularJS ng-src 指令

    转自:https://www.cnblogs.com/best/tag/Angular/ 1. <!DOCTYPE html> <html> <head> < ...