classloader 简单介绍

原创 2013年12月04日 10:25:26

文章摘抄至http://longdick.iteye.com/blog/442213/

 

要深入了解ClassLoader,首先就要知道ClassLoader是用来干什么的,顾名思义,它就是用来加载Class文件到JVM,以供程序使用的。我们知道,java程序可以动态加载类定义,而这个动态加载的机制就是通过ClassLoader来实现的,所以可想而知ClassLoader的重要性如何。 

 

看到这里,可能有的朋友会想到一个问题,那就是既然ClassLoader是用来加载类到JVM中的,那么ClassLoader又是如何被加载呢?难道它不是java的类? 

 

没有错,在这里确实有一个ClassLoader不是用java语言所编写的,而是JVM实现的一部分,这个ClassLoader就是bootstrap classloader(启动类加载器),这个ClassLoader在JVM运行的时候加载java核心的API以满足java程序最基本的需求,其中就包括用户定义的ClassLoader,这里所谓的用户定义是指通过java程序实现的ClassLoader,一个是ExtClassLoader,这个ClassLoader是用来加载java的扩展API的,也就是/lib/ext中的类,一个是AppClassLoader,这个ClassLoader是用来加载用户机器上CLASSPATH设置目录中的Class的,通常在没有指定ClassLoader的情况下,程序员自定义的类就由该ClassLoader进行加载。 


 

当运行一个程序的时候,JVM启动,运行bootstrap classloader,该ClassLoader加载java核心API(ExtClassLoader和AppClassLoader也在此时被加载),然后调用ExtClassLoader加载扩展API,最后AppClassLoader加载CLASSPATH目录下定义的Class,这就是一个程序最基本的加载流程

 

java应用环境中不同的class分别由不同的ClassLoader负责加载。
一个jvm中默认的classloader有Bootstrap ClassLoader、Extension ClassLoader、App ClassLoader,分别各司其职:

  • Bootstrap ClassLoader      负责加载java基础类,主要是 %JRE_HOME/lib/ 目录下的rt.jar、resources.jar、charsets.jar和class等
  • Extension ClassLoader       负责加载java扩展类,主要是 %JRE_HOME/lib/ext 目录下的jar和class
  • App ClassLoader           负责加载当前java应用的classpath中的所有类。

其中Bootstrap ClassLoader是JVM级别的,由C++撰写;Extension ClassLoader、App ClassLoader都是java类,都继承自URLClassLoader超类。
Bootstrap ClassLoader由JVM启动,然后初始化sun.misc.Launcher ,sun.misc.Launcher初始化Extension ClassLoader、App ClassLoader。

下图是ClassLoader的加载类流程图,以加载一个类的过程类示例说明整个ClassLoader的过程。

public class ClassLoaderTree {
	public static void main(String[] args) {
		ClassLoader loader = ClassLoaderTree.class.getClassLoader();
		/**
		 sun.misc.Launcher$AppClassLoader@39ab89 系统类加载器
		 sun.misc.Launcher$ExtClassLoader@2cb49d 扩展类加载器
		 */
		while(loader != null){
			System.out.println(loader.toString());
			loader = loader.getParent();
		}
	}
}

 

Bootstrap ClassLoader、Extension ClassLoader、App ClassLoader三者的关系如下:

Bootstrap ClassLoader是Extension ClassLoader的parent,Extension ClassLoader是App ClassLoader的parent。但是这并不是继承关系,只是语义上的定义,基本上,每一个ClassLoader实现,都有一个Parent ClassLoader。

 

可以通过ClassLoader的getParent方法得到当前ClassLoader的parent。Bootstrap ClassLoader比较特殊,因为它不是java class所以Extension ClassLoader的getParent方法返回的是NULL。

 

当使用ClassLoader类的loadClass()方法来加载某个类时,该方法只是加载该类,并不会执行该类的初始化。使用Class的forName()静态方法才会导致强制初始化该类。

package hb.reflect;
public class Tester{
	static{
		System.out.println("初始化块");
	}
}

 

package hb.reflect;
public class ClassLoaderTest {
	public static void main(String[] args) throws ClassNotFoundException {
		ClassLoader c1 = ClassLoader.getSystemClassLoader();
		//不会执行初始化
		c1.loadClass("hb.reflect.Tester");
		
		System.out.println("系统加载Tester类");
		//执行初始化内容
		Class.forName("hb.reflect.Tester");
		
	}

}

 打印内容:

系统加载Tester类

初始化块

 

如果将代码如下修改:

package hb.classloader;
public class ClassLoaderTest {

	public static void main(String[] args) throws ClassNotFoundException {
		
		ClassLoader c1 = ClassLoader.getSystemClassLoader();
		//不会执行初始化
		Class clazz = c1.loadClass("hb.classloader.Tester");
		//
		try {
			Tester tester = (Tester)clazz.newInstance();
			tester.print("class.newInstance() is ok");
		} catch (InstantiationException | IllegalAccessException e) {
			e.printStackTrace();
		}
		
		System.out.println("系统加载Tester类");
		//执行初始化内容
		Class.forName("hb.classloader.Tester");
		
	}

}

 打印结果:

初始化块

class.newInstance() is ok

系统加载Tester类

 
备注:因为在调用getInstance()方法实际上就是创建一个无参的构造函数,因此需要初始化Tester类,所以与上面的有点区别。
  • af8cd370-6958-3805-a5b8-a728beb6001d-thumb.jpg
  • 大小: 65.9 KB

Hibernate简单介绍

. Hibernate介绍:      Hibernate是一个开源的对象关系映射框架,它对JDBC进行了轻量级的对象封装,使Java程序员可以随心所欲的使用对象编程思维来操纵数据库。它不仅提供了从...
  • clypm
  • clypm
  • 2014年03月20日 11:07
  • 1525

Struts2(一)——总体介绍

这篇博客开始将总结一下有关框架的知识,在开发中合适的利用框架会使我们的开发效率大大提高。当今比较流行的开源框架: 关注数据流程的MVC框架 (Struts1/2, WebWork, Sprin...
  • liujiahan629629
  • liujiahan629629
  • 2014年03月05日 19:44
  • 18524

Spring学习笔记一(Spring简单介绍)

1.前言 从今天起开始写几篇关于Spring的文章,来总结一下,近来的学习情况,也想与大家分享一下学习Spring的心得和体会。希望大家能够多多指正。  2.Spring简单介绍 上...
  • ZHOUCHAOQIANG
  • ZHOUCHAOQIANG
  • 2015年08月09日 22:00
  • 1483

一个简单的ClassLoader

  • 2014年03月22日 18:04
  • 975B
  • 下载

自定义ClassLoader的简单例子 - bitan????s java - CSDNBlog

导读: Test1.java: package test; import java.io.*; import java.lang.reflect.*; class ACla...
  • u013244517
  • u013244517
  • 2015年02月26日 17:01
  • 180

ClassLoader 简单总结

做Java开发,对于ClassLoader的机制是必须要熟悉的基础知识,本文针对Java ClassLoader的机制做一个简要的总结。因为不同的JVM的实现不同,本文所描述的内容均只限于Hotspo...
  • qpzkobe
  • qpzkobe
  • 2017年12月13日 14:17
  • 33

JAVA反射机制深入学习(三)ClassLoader类装载器介绍

接下来介绍下JAVA中非常重要的一个类ClassLoader(类装载器) 类装载器就是寻找类的字节码文件并构造出类在JVM内部表示的对象组件。主要工作由ClassLoader及其子类负责,Clas...
  • icarus_wang
  • icarus_wang
  • 2016年05月29日 12:55
  • 855

JVM之类加载器(ClassLoader)基本介绍

类加载器用于将class文件加载到JVM中去执行。下面介绍类加载器涉及到的基本概念和加载基本过程。 一、Java虚拟机与程序的生命周期         在运行Java程序时,会启动JVM进程,该进程...
  • sunfeizhi
  • sunfeizhi
  • 2015年11月30日 10:27
  • 469

java和android classloader介绍

1. 背景介绍   java虚拟机:是java的执行的环境。因为java是解释执行的,并且是跨平台的,所以屏蔽平台之间的差异性的工作就交由java虚拟机来完成。至于更具体的可以百度之。 Dal...
  • donway8700
  • donway8700
  • 2012年05月22日 23:39
  • 1092

(4.2.32.1)android热修复之ClassLoader方式:安卓App热补丁动态修复技术介绍(QQ控件||Nuwa)

1.背景 当一个App发布之后,突然发现了一个严重bug需要进行紧急修复,这时候公司各方就会忙得焦头烂额:重新打包App、测试、向各个应用市场和渠道换包、提示用户升级、用户下载、覆盖安装。有时候仅仅...
  • fei20121106
  • fei20121106
  • 2016年07月04日 11:52
  • 700
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:classloader 简单介绍
举报原因:
原因补充:

(最多只允许输入30个字)