`

classloader简介

阅读更多
一、基本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
分享到:
评论

相关推荐

    ClassLoader

    Java 虚拟机中ClassLoader 相关简介 双亲委托机制 Android 中ClassLoader 简介

    java ClassLoader机制及其在OSGi中的应用

    内容简介: ClassLoader体系结构 类装载器在JVM中并不是唯一的,JVM自带了三个装载器,用户也可以根据自己的需求自定义新的装载器,这些装载器的体系结构可以看作是树状结构,如图1所示:

    xposed_module_loader:这是一个可以加载android系统中所有已安装的xposed模块的库

    简介这是App加载已安装的Xposed Modules的一个库。其中,app : App Sample代码,应用启动后,就会默认加载系统里所有已安装的Xposed Modules;core : 加载代码,主要逻辑是读取所有已安装的Xposed Module,并构建...

    Java高并发编程详解:多线程与架构设计 (Java核心技术系列)

    内容简介 本书主要包含四个部分: 部分主要阐述Thread的基础知识,详细介绍线程的API使用、线程安全、线程间数据通信,以及如何保护共享资源等内容,它是深入学习多线程内容的基础。 第二部分引入了ClassLoader,这...

    Android开发中类加载器DexClassLoader的简单使用讲解

    简介 “类装载器”(ClassLoader),顾名思义,就是用来动态装载class文件的。标准的Java SDK中有个ClassLoader类,借助此类可以装载需要的class文件,前提是ClassLoader类初始化必须制定class文件的路径。 import...

    深入JVM内核 - 原理、诊断与优化

    课程简介: 目前,Java是最为流行的编程语言之一,它的基础平台就是JVM。除了Java,如JRuby、Scala、Clojure等语言也运行在JVM平台。熟悉和掌握JVM平台有着重要的实用价值和意义。 在本课程中个,将详细介绍JVM的...

    Android代码-android-advanced-decode

    简介 chapter_12 第12章 理解ClassLoader chapter_13 第13章 热修复原理 chapter_14 第14章 Hook技术 chapter_15 第15章 插件化技术 本书内容 本书共分为17章,各章内容如下: 第1章介绍Android系统...

    java8源码-jdk8-source:jdk8-源代码

    简介 Java8源码学习 ├── com/ ├── java/(常用代码都在此文件夹下) │ ├── lang/ │ │ ├── ClassLoader │ │ ├── Enum │ │ ├── Integer │ │ ├── Long │ │ ├── String │ │ ├── ...

    Java大师级源码-Java8-Source-Code-master:jdk1.8源码,无注释版本

    简介 Java8源码学习 ├── com/ ├── java/(常用代码都在此文件夹下) │ ├── lang/ │ │ ├── ClassLoader │ │ ├── Enum │ │ ├── Integer │ │ ├── Long │ │ ├── String │ │ ├── ...

    java8源码-java8-source-code:Java8API源代码

    简介 Java8源码学习 ├── com/ ├── java/(常用代码都在此文件夹下) │ ├── lang/ │ │ ├── ClassLoader │ │ ├── Enum │ │ ├── Integer │ │ ├── Long │ │ ├── String │ │ ├── ...

    XposedAppium:基于Xposed自动化框架

    简介: 基于Xposed做的一种自动化点击,滑动框架(基于安卓原生的事件分布)。可以模拟手指的一切操作。基于Xpath表达获取View。 项目结构介绍: 应用:目标应用 xposedemo:xposed模块的使用demo XposedAppiumLib...

    Java JDK 7学习笔记(国内第一本Java 7,前期版本累计销量5万册)

    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 使用...

    xmljava系统源码-java-trader:Java期货交易者CTPFEMASXTP

    简介 java-trader项目目标是成为一个基于Java的开源期货交易框架, 有这些特点: 分布式管理界面, 支持交易服务的集中管理 基于纯Java的行情和交易接口, 内建支持JCTP, 支持运行时指定JCTP版本, 具体指定方式参见...

    java8源码-Java8SourceCode:Java8源代码

    简介 Java8源码学习 ├── com/ ├── java/(常用代码都在此文件夹下) │ ├── lang/ │ │ ├── ClassLoader │ │ ├── Enum │ │ ├── Integer │ │ ├── Long │ │ ├── String │ │ ├── ...

    java8源码-jdk8-code:jdk1.8

    简介 Java8源码学习 ├── com/ ├── java/(常用代码都在此文件夹下) │ ├── lang/ │ │ ├── ClassLoader │ │ ├── Enum │ │ ├── Integer │ │ ├── Long │ │ ├── String │ │ ├── ...

    java8源码-Java8-Source-Code:java8源码阅读

    简介 Java8源码学习 ├── com/ ├── java/(常用代码都在此文件夹下) │ ├── lang/ │ │ ├── ClassLoader │ │ ├── Enum │ │ ├── Integer │ │ ├── Long │ │ ├── String │ │ ├── ...

    Hibernate Validator 开源框架 v5.4.0

    Hibernate Validator 开源框架更新HV-1155 - engine - ClassLoader issues in modularized environmentsHibernate Validator 开源框架简介Hibernate Validator 就是用 Annotations 给类或者类的属性加上约束...

    水木清华站∶Java版精华区 含jsp及js等集合.chm

    [目录]关于classloader 2. [目录]Java汉字问题 3. [目录]Java中的界面处理 1. [目录]Java中的鼠标操作 2. [目录]如何使画面不闪烁? 4. [目录]Java与Internet 1. [目录]Socket方面的...

    基于JAVA的学生通讯录管理系统设计和实现[文献综述].doc

    二、主题部分 一、Java简介 Java是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台的 总称。用Java实现的HotJava浏览器(支持Java applet)显示了Java的魅力:跨平台、 动态的Web、Internet...

Global site tag (gtag.js) - Google Analytics