ClassLoader简单介绍
要理解ClassLoader,我们可以通过what、how两个方面来解释
一、what:什么事ClassLoader?
1、ClassLoader可以是将class文件加载到JVM方法区。
2、ClassLoader主要分为2类,用户自定义的类加载器和内部类加载器:启动内装载器(bootstrap)和用户自定义装载器(user-defined class loader)。
启动类装器分为3类:Bootstrap ClassLoader:启动类加载器,是Java类加载层次中最顶层的类加载器,是Extension ClassLoader的父加载器,因为Bootstrap ClassLoader是用c++写的,所有在java代码中无法找到
该类。主要负责加载JDK中的核心类库,如:rt.jar、resources.jar、charsets.jar等。
Extension ClassLoader:称为扩展类加载器,负责加载Java的扩展类库,默认加载JAVA_HOME/jre/lib/ext/目下的所有jar。
AppClassLoader:称为系统类加载器,负责加载应用程序classpath目录下的所有jar和class文件。
3、ClassLoader的加载原理:
ClassLoader加载类的原理:使用双亲委托机制;当ClassLoader需要加载某个类时,它在搜索该类之前会将搜索的任务交给父加载器试图加载。所以搜索的过程是从Bootstrap ClassLoader——>
Extension ClassLoader——>Extension ClassLoader——>App ClassLoader依次查找,查到到对应的类,就将该对象加载到JVM中。使用该委托机制主要是为了防止人恶意修改JDK的核心代码,比如你自己创建
了一个类为String,包名也为java.lang,如果没有委托机制,那么调用String类时可能加载的就是你定义的String类。而不是JDK所提供的String类。二委托机制从Bootstrap ClassLoader开始搜索,在java的核心库
中找到了该类,就直接将该类加载到JVM中,就不会读取到你所写的String类。
//获取当前的类加载器
ClassLoader loader=Thread.currentThread().getContextClassLoader();
System.out.println(loader);
while(loader!=null){
loader=loader.getParent();
System.out.println(loader);
}
输出结果为:

二、how:如何自定义类加载器
1、应用场景:我们需要加载网上的class文件到内存中,使用该类实现我们项目所需的业务逻辑。
2、自定义类加载器分两步:继承ClassLoader类,重写findClass方法
package edu.test; import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL; public class NetWorkClassLoader extends ClassLoader { private String rootUrl; public NetWorkClassLoader(String rootUrl) {
this.rootUrl = rootUrl;
} @Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
Class clazz = null; byte[] classData = getClassDate(name); // 根据类的二进制名称,获得该class文件的字节码数组
if (classData == null) {
throw new ClassNotFoundException();
}
clazz = defineClass(name, classData, 0, classData.length); // 将class的字节码数组转换成Class类的实例 return clazz;
} // 根据类的二进制名称,获取该class文件的字节码文件
private byte[] getClassDate(String name) {
InputStream input = null;
ByteArrayOutputStream baos = null;
String path = classNameToPath(name);
try {
URL url = new URL(path);
byte[] buff = new byte[1024 * 4];
int len = -1;
input = url.openStream();
baos = new ByteArrayOutputStream();
while ((len = input.read(buff)) != -1) {
baos.write(buff, 0, len);
} } catch (Exception e) {
e.printStackTrace();
} finally {
if (input == null) {
try {
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} return baos.toByteArray();
} private String classNameToPath(String name) {
return rootUrl + "/" + name.replace(".", "/") + ".class";
}
}
类加载器测试
public class ClassLoaderTest {
public static void main(String[] args) {
try {
String rootUrl = "http://localhost:8080/httpweb/classes";
NetWorkClassLoader networkClassLoader = new NetWorkClassLoader(rootUrl);
String classname = "org.classloader.simple.NetClassLoaderTest";
Class clazz = networkClassLoader.loadClass(classname);
System.out.println(clazz.getClassLoader());
} catch (Exception e) {
e.printStackTrace();
}
}
}
ClassLoader简单介绍的更多相关文章
- [原创]关于mybatis中一级缓存和二级缓存的简单介绍
关于mybatis中一级缓存和二级缓存的简单介绍 mybatis的一级缓存: MyBatis会在表示会话的SqlSession对象中建立一个简单的缓存,将每次查询到的结果结果缓存起来,当下次查询的时候 ...
- 利用Python进行数据分析(7) pandas基础: Series和DataFrame的简单介绍
一.pandas 是什么 pandas 是基于 NumPy 的一个 Python 数据分析包,主要目的是为了数据分析.它提供了大量高级的数据结构和对数据处理的方法. pandas 有两个主要的数据结构 ...
- 利用Python进行数据分析(4) NumPy基础: ndarray简单介绍
一.NumPy 是什么 NumPy 是 Python 科学计算的基础包,它专为进行严格的数字处理而产生.在之前的随笔里已有更加详细的介绍,这里不再赘述. 利用 Python 进行数据分析(一)简单介绍 ...
- yii2的权限管理系统RBAC简单介绍
这里有几个概念 权限: 指用户是否可以执行哪些操作,如:编辑.发布.查看回帖 角色 比如:VIP用户组, 高级会员组,中级会员组,初级会员组 VIP用户组:发帖.回帖.删帖.浏览权限 高级会员组:发帖 ...
- angular1.x的简单介绍(二)
首先还是要强调一下DI,DI(Denpendency Injection)伸手获得,主要解决模块间的耦合关系.那么模块是又什么组成的呢?在我看来,模块的最小单位是类,多个类的组合就是模块.关于在根模块 ...
- Linux的简单介绍和常用命令的介绍
Linux的简单介绍和常用命令的介绍 本说明以Ubuntu系统为例 Ubuntu系统的安装自行百度,或者参考http://www.cnblogs.com/CoderJYF/p/6091068.html ...
- iOS-iOS开发简单介绍
概览 终于到了真正接触IOS应用程序的时刻了,之前我们花了很多时间去讨论C语言.ObjC等知识,对于很多朋友而言开发IOS第一天就想直接看到成果,看到可以运行的IOS程序.但是这里我想强调一下,前面的 ...
- iOS开发多线程篇—多线程简单介绍
iOS开发多线程篇—多线程简单介绍 一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcod ...
- iOS开发UI篇—UITabBarController简单介绍
iOS开发UI篇—UITabBarController简单介绍 一.简单介绍 UITabBarController和UINavigationController类似,UITabBarControlle ...
随机推荐
- Delphi的WebBrowser改造,对网页中Alter等对话框的改造方法(通过COM来改造)
刚有一段时间没做博客了,今天刚好有人问了这个问题,而自己以前也弄过,于是这里有了一篇新的博文. 关于改造WebBrowser控件的一些技巧,大家可以参考MSDN或者蒋晟写的一个东西,里面有讲的很详细的 ...
- 《火球——UML大战需求分析》(0.2)——目录
说明: <火球——UML大战需求分析>是我撰写的一本关于需求分析及UML方面的书,我将会在CSDN上为大家分享前面几章的内容,总字数在几万以上,图片有数十张.欢迎你按文章的序号顺序阅读,谢 ...
- speex 回声消除的用法
speex 回声消除的用法 分类: speex AEC 回声消除 2012-11-13 11:24 1336人阅读 评论(0) 收藏 举报 speex的回声消息 就是speex_echo_cancel ...
- cluster maintain manager Software群集管理软件
1,ocfs2 2,crmsh(cluster management shell,)==crm shell [pacemaker OpenAIS,heartbeat,corosync,crmsh] 3 ...
- ubuntu 12.04下安装和配置kohana 3.3.3 的方法
一.先到官网下载3.3.3版本的压缩包到/var/www/1117/目录下(提前建好1117的目录)解压 解压好的文件有(applications\modules\system\build.xml\c ...
- 被拒--悲剧之ORA-01017: invalid username/password; logon denied 错误
本地没有安装oracle.安装了oracleclient和PL/SQL Developer.来实现对oracle数据库的可视化操作. 在使用在登录PL/SQL无法登录.提示错误:ORA-01017: ...
- cc150:实现一个算法来删除单链表中间的一个结点,仅仅给出指向那个结点的指针
实现一个算法来删除单链表中间的一个结点,仅仅给出指向那个结点的指针. 样例: 输入:指向链表a->b->c->d->e中结点c的指针 结果:不须要返回什么,得到一个新链表:a- ...
- CSS 布局总结——固定宽度布局
固定宽度布局 单列布局 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2Fyd29sZjI0/font/5a6L5L2T/fontsize/400/fil ...
- SSO 基于Cookie+fliter实现单点登录(SSO):工作原理
SSO的概念: 单点登录SSO(Single Sign-On)是身份管理中的一部分. SSO的一种较为通俗的定义是:SSO是指訪问同一server不同应用中的受保护资源的同一用户,仅仅须要登录一次,即 ...
- iOS中UIWebView使用JS交互 - 机智的新手
iOS中偶尔也会用到webview来显示一些内容,比如新闻,或者一段介绍.但是用的不多,现在来教大家怎么使用js跟webview进行交互. 这里就拿点击图片获取图片路径为例: 1.测试页面html & ...