java反射机制剖析(二)— Class Loader
上一篇博客简要的提了一下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的更多相关文章
- Java反射机制剖析(二)-功能以及举例
从<java反射机制剖析(一)>的API我们看到了许多接口和类,我们能够通过这些接口做些什么呢? 从上篇API中我们能看到它能够完成下面的这些功能: 1) 获得类 A. 运 ...
- Java反射机制剖析(三)-简单谈谈动态代理
通过Java反射机制剖析(一)和Java反射机制剖析(二)的学习,已经对反射有了一定的了解,这一篇通过动态代理的例子来进一步学习反射机制. 1. 代理模式 代理模式就是为其他对象提供一种代理来 ...
- Java反射机制剖析(四)-深度剖析动态代理原理及总结
动态代理类原理(示例代码参见java反射机制剖析(三)) a) 理解上面的动态代理示例流程 a) 理解上面的动态代理示例流程 b) 代理接口实现类源代码剖析 咱们一起来剖析一下代理实现类($Pr ...
- Java反射机制剖析(一)-定义和API
1. 什么是Java反射机制 Java的反射机制是在程序运行时,能够完全知道任何一个类,及其它的属性和方法,并且能够任意调用一个对象的属性和方法.这种运行时的动态获取就是Java的反射机制.其 ...
- 【54】Java反射机制剖析
java反射机制: 1.指的是可以于运行时加载,探知和使用编译期间完全未知的类. 2.程序在运行状态中, 可以动态加载一个只有名称的类, 对于任意一个已经加载的类,都能够知道这个类的所有属性和方法; ...
- 菜鸟学Java(十五)——Java反射机制(二)
上一篇博文<菜鸟学编程(九)——Java反射机制(一)>里面,向大家介绍了什么是Java的反射机制,以及Java的反射机制有什么用.上一篇比较偏重理论,理论的东西给人讲出来总感觉虚无缥缈, ...
- Java反射机制(二):通过反射取得类的结构
在反射运用过程中,如果你想得到一个类的完整结构,那么就要使用到java.lang.reflect包中的几个类: · Constructor 表示类中的构造方法 · Field 表示类中的属性 · ...
- Java 反射机制(二)
<Core Java Volume I --- Fundamentals>介绍了三种创建Class对象的方法.本文将举例说明这三种创建Class对象---创建类的方法. 一.public ...
- 菜鸟学Java(十四)——Java反射机制(一)
说到反射,相信有过编程经验的人都不会陌生.反射机制让Java变得更加的灵活.反射机制在Java的众多特性中是非常重要的一个.下面就让我们一点一点了解它是怎么一回事. 什么是反射 在运行状态中,对于任意 ...
随机推荐
- [HAOI2015]树上染色(树形dp)
[HAOI2015]树上染色 题目描述 有一棵点数为 N 的树,树边有边权.给你一个在 0~ N 之内的正整数 K ,你要在这棵树中选择 K个点,将其染成黑色,并将其他 的N-K个点染成白色 . 将所 ...
- HTTP——状态码
(转载) 完整的 HTTP 1.1规范说明书来自于RFC 2616,你可以在http://www.talentdigger.cn/home/link.php?url=d3d3LnJmYy1lZGl0b ...
- hadoop-08-关闭THP服务
hadoop-08-关闭THP服务 #查看THP服务cat /sys/kernel/mm/redhat_transparent_hugepage/enabledcat /sys/kernel/mm/r ...
- POJ--1966--Cable TV Network【无向图顶点连通度】
链接:http://poj.org/problem?id=1966 题意:一个无向图,n个点,m条边,求此图的顶点连通度. 思路:顶点连通度,即最小割点集里的割点数目.一般求无向图顶点连通度的方法是转 ...
- a+=b 等价于 a=a+b ?
a += b和a = a + b全然等价么(java)?可能非常多人以为是一样的,事实上并不是等价的,以下看一下证据吧. public class Test { public static void ...
- iOS 中client和server的 Web Service 网络通信 (1)
当你打开你手机上新浪微博应用或者知乎应用是.你是否会去想这些显示在手机上的图片和数据时从哪里来的?又是通过如何的方法实现的?好.那么接下来就介绍是如何实现的.过程又是怎么样的. 当我们浏览着 ...
- Android 经常使用工作命令mmm,mm,m,croot,cgrep,jgrep,resgrep,godir
官方定义: Invoke ". build/envsetup.sh" from your shell to add the following functions to your ...
- bzoj3931: [CQOI2015]网络吞吐量(spfa+网络流)
3931: [CQOI2015]网络吞吐量 题目:传送门 题解: 现在有点难受....跳了一个多钟...菜啊... 题意都把做法一起给了....最短路+网路流啊. 不想说话...记得开long lon ...
- zzulioj--1827--石锅全拌(区间求和水题)
1827: 石锅全拌 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 6 Solved: 3 SubmitStatusWeb Board Descri ...
- 48.AngularJS ng-src 指令
转自:https://www.cnblogs.com/best/tag/Angular/ 1. <!DOCTYPE html> <html> <head> < ...