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的众多特性中是非常重要的一个.下面就让我们一点一点了解它是怎么一回事. 什么是反射 在运行状态中,对于任意 ...
随机推荐
- C++调用约定和名字约定 thiscall
调用约定: __cdecl __fastcall与 __stdcall,三者都是调用约定(Calling convention),它决定以下内容:1)函数参数的压栈顺序,2)由调用者还是被调用者把参数 ...
- the prblem 3n+1
题目描述计算机科学中的问题通常被归类为属于某一类问题(例如,NP,不可解,递归).在这个问题中,您将分析算法的属性,该算法的分类对于所有可能的输入都是未知的. 考虑下面的算法: 1.输入n 2.输出n ...
- 运维派 企业面试题6 防dos攻击
Linux运维必会的实战编程笔试题(19题) 企业实战题6:请用至少两种方法实现! 写一个脚本解决DOS攻击生产案例 提示:根据web日志或者或者网络连接数,监控当某个IP并发连接数或者短时内PV达到 ...
- 搭建appium环境
1.下载jdk1.8 配置环境变量 JAVA_HOME---------->你的jdk路径 path---------------------->%JAVA_HOME%\bin;%JAV ...
- [NOIP补坑计划]NOIP2014 题解&做题心得
六道普及组题,没啥好说的 场上预计得分:100+100+100+100+100+100=600(省一分数线490) (AK是不可能AK的,这辈子不可能AK的) 题解: D1T1 生活大爆炸版石头剪刀布 ...
- S-T表学习笔记
$O(nlogn)$构造$O(1)$查询真是太强辣 然而不支持修改= = ShØut! #include<iostream> #include<cstring> #includ ...
- [zjoi2016]小星星 (容斥+DP)
我们先用树形DP,求出选取集合S中的点,满足连通性的但是标号可重的方案数,贡献给F(i)(1\(\leq\)i\(\leq\)\(\mid S\mid\)),也就是我们要处理出F(i)代表取至多i个点 ...
- Python: 自定义类对象序列化为Json串
之前已经实现了Python: Json串反序列化为自定义类对象,这次来实现了Json的序列化. 测试代码和结果如下: import Json.JsonTool class Score: math = ...
- 紫书 例题11-11 UVa 12661 (dihkstra变形)
这道题主要比较权值的时候要改变一下,其他地方基本一样. 比较权值的时候要考虑边的时间与a, b 可以设相对于当前边的时间now, 则now = d[u] % (a+b), 也就是当前这个边进行到整个a ...
- Linux学习总结(14)——Linux权限控制
linux中,权限的学习是必不可少的,不论是作为一名运维工程师或者是单一的管理者,学习好linux中的权限控制,你就可以保护好自己的隐私同时规划好你所管理的一切. 权限的学习是很多的,不要认为自己已经 ...