一、基本classloader体系
默认有3个classloader,分别是bootstrap、extension、app(system)
bootstrap是在JVM启动时加载的,会读取$JAVA_HOME/lib下的class
extension会读取$JAVA_HOME/lib/ext下的class
app,也称为system,加载应用程序所需的class,是由classpath变量指定的,如果在运行时不加-classpath参数,则默认会以当前目录为根路径
这3个classpath存在父子关系,遵循基本的委托模型,即当classloader被要求加载一个类时,它会首先委托parent classloader进行加载,如果没有找到,才会自己负责加载。这个设计主要是从安全性方面考虑
二、classloader相关的API
如果只是做应用层面的开发的话,可能都不会涉及到classloader的知识,只要知道上述的基本模型就可以了。但是如果要理解一些更复杂的东西,比如JNDI,或者开发应用服务器,或者实现一个插件体系的框架,那就需要对classloader的知识有更深入的了解
classloader存在的目的就是为了实现对class的加载。可以认为有3种classloader
第一种是整个应用总的classloader,可以通过以下API得到这个classloader实例
ClassLoader.getSystemClassLoader();
sun.misc.Launcher$AppClassLoader@addbf1
这个API我感觉作用并不大,因为用到这个API的场景并不多,如果是开发一个简单的应用,那么根本就不关注classloader是什么。如果是开发比较复杂的应用的话,得到系统总的classloader作用也不大,因为本来就是要替换它
第二种是当前的classloader。这里首先要明白一点。就是类A依赖类B的话,那么加载类B的classloader,也就是加载类A的classloader
比如说
ClassLoader appClassLoader = BindCase.class.getClassLoader();
等价于
ClassLoader appClassLoader = bindCase.getClass().getClassLoader();
都是得到加载BindCase这个类的classloader实例,如果bindCase实例又依赖了另一个类ClassB,那么默认情况下,ClassB也会由同一个classloader负责加载
当使用Class.forName()方法时,如果不显式传递一个classloader对象,则默认是使用当前的classloader
比如说
MyClassLoader mcl = new MyClassLoader();// 该ClassLoader可以读取外部类
Class.forName("xxx.xxx.xxx");
这段代码会抛ClassNotFoundException,虽然mcl可以加载外部类,但是它并不是“当前classloader”,当执行Class.forName()时,用的还是当前的classloader,所以外部类是加载不到的
第三种是当前线程的classloader。这里也有一个背景,每个线程都有一个ContextClassLoader,开启子线程之后,子线程的ContextClassLoader就是父线程的ContextClassLoader
以下两个API可以分别用来获取和设置ContextClassLoader
thread.getContextClassLoader();
thread.setContextClassLoader();
这2个API非常重要,因为可以起到传递classloader的作用,很多自定义的classloader体系,都用到了这2个API
三、一段实例测试代码
这段代码是模拟tomcat的加载过程
Bootstrap类在app classloader中加载,Catalina类在$CATALINA_HOME/lib/catalina.jar下,通过自定义classloader动态加载
public class Bootstrap {
public static void main(String[] args) throws MalformedURLException,
ClassNotFoundException {
String FQCN = "org.apache.catalina.startup.Catalina";// 要加载的目标类
try {
Class.forName(FQCN);// it's NOT OK
} catch (Exception e) {
e.printStackTrace();
}
try {
ClassLoader.getSystemClassLoader().loadClass(FQCN);// it's NOT OK
} catch (Exception e) {
e.printStackTrace();
}
try {
Bootstrap.class.getClassLoader().loadClass(FQCN);// it's NOT OK
} catch (Exception e) {
e.printStackTrace();
}
try {
Thread currentThread = Thread.currentThread();
currentThread.getContextClassLoader().loadClass(FQCN);// it's NOT OK
} catch (Exception e) {
e.printStackTrace();
}
ClassLoader myClassLoader = createClassLoader();
myClassLoader.loadClass(FQCN);// it's OK
System.out.println("over");
}
/**
* 实例化一个ClassLoader,加载了C盘根目录下的dummy_catalina.jar,其中包含Catalina类的定义
*/
private static ClassLoader createClassLoader() throws MalformedURLException {
String filePath = "c://dummy_catalina.jar";
File file = new File(filePath);
URL url = file.toURI().toURL();
URL[] urls = new URL[] { url };
ClassLoader myClassLoader = new URLClassLoader(urls);
return myClassLoader;
}
}
- 大小: 49 KB
分享到:
相关推荐
Java 虚拟机中ClassLoader 相关简介 双亲委托机制 Android 中ClassLoader 简介
内容简介: ClassLoader体系结构 类装载器在JVM中并不是唯一的,JVM自带了三个装载器,用户也可以根据自己的需求自定义新的装载器,这些装载器的体系结构可以看作是树状结构,如图1所示:
简介这是App加载已安装的Xposed Modules的一个库。其中,app : App Sample代码,应用启动后,就会默认加载系统里所有已安装的Xposed Modules;core : 加载代码,主要逻辑是读取所有已安装的Xposed Module,并构建...
内容简介 本书主要包含四个部分: 部分主要阐述Thread的基础知识,详细介绍线程的API使用、线程安全、线程间数据通信,以及如何保护共享资源等内容,它是深入学习多线程内容的基础。 第二部分引入了ClassLoader,这...
简介 “类装载器”(ClassLoader),顾名思义,就是用来动态装载class文件的。标准的Java SDK中有个ClassLoader类,借助此类可以装载需要的class文件,前提是ClassLoader类初始化必须制定class文件的路径。 import...
课程简介: 目前,Java是最为流行的编程语言之一,它的基础平台就是JVM。除了Java,如JRuby、Scala、Clojure等语言也运行在JVM平台。熟悉和掌握JVM平台有着重要的实用价值和意义。 在本课程中个,将详细介绍JVM的...
简介 chapter_12 第12章 理解ClassLoader chapter_13 第13章 热修复原理 chapter_14 第14章 Hook技术 chapter_15 第15章 插件化技术 本书内容 本书共分为17章,各章内容如下: 第1章介绍Android系统...
简介 Java8源码学习 ├── com/ ├── java/(常用代码都在此文件夹下) │ ├── lang/ │ │ ├── ClassLoader │ │ ├── Enum │ │ ├── Integer │ │ ├── Long │ │ ├── String │ │ ├── ...
简介 Java8源码学习 ├── com/ ├── java/(常用代码都在此文件夹下) │ ├── lang/ │ │ ├── ClassLoader │ │ ├── Enum │ │ ├── Integer │ │ ├── Long │ │ ├── String │ │ ├── ...
简介 Java8源码学习 ├── com/ ├── java/(常用代码都在此文件夹下) │ ├── lang/ │ │ ├── ClassLoader │ │ ├── Enum │ │ ├── Integer │ │ ├── Long │ │ ├── String │ │ ├── ...
简介: 基于Xposed做的一种自动化点击,滑动框架(基于安卓原生的事件分布)。可以模拟手指的一切操作。基于Xpath表达获取View。 项目结构介绍: 应用:目标应用 xposedemo:xposed模块的使用demo XposedAppiumLib...
15.2.2 建立classloader实例 518 15.3 重点复习 520 15.4 课后练习 521 chapter16 自定义泛型、枚举与标注 523 16.1 自定义泛型 524 16.1.1 定义泛型方法 524 16.1.2 使用extends与? 525 16.1.3 使用...
简介 java-trader项目目标是成为一个基于Java的开源期货交易框架, 有这些特点: 分布式管理界面, 支持交易服务的集中管理 基于纯Java的行情和交易接口, 内建支持JCTP, 支持运行时指定JCTP版本, 具体指定方式参见...
简介 Java8源码学习 ├── com/ ├── java/(常用代码都在此文件夹下) │ ├── lang/ │ │ ├── ClassLoader │ │ ├── Enum │ │ ├── Integer │ │ ├── Long │ │ ├── String │ │ ├── ...
简介 Java8源码学习 ├── com/ ├── java/(常用代码都在此文件夹下) │ ├── lang/ │ │ ├── ClassLoader │ │ ├── Enum │ │ ├── Integer │ │ ├── Long │ │ ├── String │ │ ├── ...
简介 Java8源码学习 ├── com/ ├── java/(常用代码都在此文件夹下) │ ├── lang/ │ │ ├── ClassLoader │ │ ├── Enum │ │ ├── Integer │ │ ├── Long │ │ ├── String │ │ ├── ...
Hibernate Validator 开源框架更新HV-1155 - engine - ClassLoader issues in modularized environmentsHibernate Validator 开源框架简介Hibernate Validator 就是用 Annotations 给类或者类的属性加上约束...
[目录]关于classloader 2. [目录]Java汉字问题 3. [目录]Java中的界面处理 1. [目录]Java中的鼠标操作 2. [目录]如何使画面不闪烁? 4. [目录]Java与Internet 1. [目录]Socket方面的...
二、主题部分 一、Java简介 Java是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台的 总称。用Java实现的HotJava浏览器(支持Java applet)显示了Java的魅力:跨平台、 动态的Web、Internet...