`
kankan1218
  • 浏览: 271883 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

ClassLoader加载机制

阅读更多

 

JVM在运行时会产生三个ClassLoader 
1.Bootstrap ClassLoader 
  c++编写的,启动JVM时调用的类加载器,主要用来加载JRE_HOME/lib当前目录下的核心jar,例如:rt.jar,jsse.jar等。 
2.Extension ClassLoader 
  用来加载JRE_HOME/lib/ext当前目录下核心扩展的jar,例如:dnsns.jar等 
3.AppClassLoader  
  AppClassLoader是加载Classpath下所有的jar和classes 

        这3种ClassLoader的优先级依次从高到低,使用所谓的“双亲委派模型”。确切地说,如果一个类装载器被请求装载一个java.lang.Integer,它会首先把请求发送给上一级的类路径装载器,如果返回已装载,则该类装载器将不会装载这个java.lang.Integer,如果上一级的类路径装载器返回未装载,它才会装载java.lang.Integer。 
        类似的,类路径装载器收到请求后(无论是直接请求装载还是下一级的ClassLoader上传的请求),它也会先把请求发送到上一级的标准扩展类装载器,这样一层一层上传,于是Bootstrap ClassLoader优先级最高,如果它按照自己的方式找到了java.lang.Integer,则下面的ClassLoader 都不能再装载java.lang.Integer,尽管你自己写了一个java.lang.Integer,试图取代核心库的java.lang.Integer是不可能的,因为自己写的这个类根本无法被下层的ClassLoader装载。这也是所谓的“沙箱”原理。 


除了bootstrap之外,其他的类加载器本身也都是java类,它们的父类是ClassLoader

ClassLoader的getParent()方法返回委托的父类加载器。一些实现可能使用 null 来表示引导类加载器。如果类加载器的父类加载器就是引导类加载器,则此方法将在这样的实现中返回 null

 

 

 

public class TestClassLoader {
	public static void main(String[] args) {
		Class<?> clazz = null;
		ClassLoader clazzLoader = ClassLoader.getSystemClassLoader();
		System.out.println("ClassLoader.getSystemClassLoader() = " + clazzLoader);
		while (clazzLoader != null) {
			clazzLoader = clazzLoader.getParent();
			System.out.println(clazzLoader);
		}
		System.out.println("end while.");

		try {
			clazz = Class.forName("java.lang.Object");
			clazzLoader = clazz.getClassLoader();
			System.out.println(" java.lang.Object's loader is  " + clazzLoader);

			clazz = Class.forName("sun.net.spi.nameservice.dns.DNSNameService");
			clazzLoader = clazz.getClassLoader();
			System.out.println(" sun.net.spi.nameservice.dns.DNSNameService's loader is  " + clazzLoader);

//			clazz = Class.forName("TestClassLoader");
//			clazzLoader = clazz.getClassLoader();
			clazzLoader = TestClassLoader.class.getClassLoader();
			System.out.println(" com.dextrys.test.TestLoade's loader is  " + clazzLoader);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

 

结果:

 

ClassLoader.getSystemClassLoader() = sun.misc.Launcher$AppClassLoader@19821f
sun.misc.Launcher$ExtClassLoader@addbf1
null
end while.
 java.lang.Object's loader is  null
 sun.net.spi.nameservice.dns.DNSNameService's loader is  sun.misc.Launcher$ExtClassLoader@addbf1
 com.dextrys.test.TestLoade's loader is  sun.misc.Launcher$AppClassLoader@19821f

 

 

 

 

分享到:
评论

相关推荐

    ClassLoader类加载机制和原理详解

    ClassLoader类加载机制和原理详解

    【图解版】深入分析ClassLoader类加载工作机制

    【图解版】深入分析ClassLoader类加载工作机制,从原理到JVM的装载过程,详情分析了ClassLoader加载类以及自定义类加载器的过程,不可用于商业用途,如有版权问题,请联系删除!

    ClassLoader类加载机制

    类加载器是 Java 语言的一个创新,也是 ...不过如果遇到了需要与类加载器进行交互的情况,而对类加载器的机制又不是很了解的话,就很容易花大量的时间去调试 ClassNotFoundException和 NoClassDefFoundError等异常。

    ClassLoader(类加载机制)1

    1. ClassLoader(类加载机制) 3. findLoadedClass (查找JVM已经加载过的类) 4. defineClass (定义一个Java

    tomcat 类加载机制 —— ClassLoader

    NULL 博文链接:https://yjhexy.iteye.com/blog/668334

    JAVA ClassLoader 讲解 (类加载器)

    ClassLoader类加载器讲解,理解JAVA类加载机制

    深入理解ClassLoader工作机制.docx

    JVM内存模型,类加载模式工作机制详细,内存屏障,类从被加载到虚拟机内存中开始,直到卸载出内存为止,它的整个生命周期包括了:加载、验证、准备、解析、初始化、使用和卸载这7个阶段。其中,验证、准备和解析这三...

    Java类加载机制与反射-PPT

    Java的类加载机制:加载,连接,初始化。JAVA类加载器: Bootstrap ClassLoader : 根类加载器, Extension ClassLoader: 扩展类加载器, System ClassLoader : 系统类加载器, Java反射

    类加载机制ClassLoader

    NULL 博文链接:https://shulianghan.iteye.com/blog/1699341

    Android类加载机制、插件化、热修复

    Android类加载机制、插件化、热修复相关内容。Android类加载机制、插件化、热修复相关内容。Android类加载机制、插件化、热修复相关内容。Android类加载机制、插件化、热修复相关内容。Android类加载机制、插件化、...

    Android Classloader测试demo

    用于验证理解Android中Classloader加载类机制的程序demo,从中可以对比DexClassLoader和PathClassLoader的区别联系。

    java的ClassLoader类加载器机制

    jvm运行的过程中,需要载入类,而类的加载需要类加载器,本文章提供了java的类加载器的工作原理。可以使读者更加理解jvm的运行机制。

    Java运行时环境之ClassLoader类加载机制详解

    主要给大家介绍了关于Java运行时环境之ClassLoader类加载机制的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    ClassLoader

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

    JVM类加载机制详细讲解

    讲解JVM的ClassLoader子系统原理.

    深入解析Java中的Classloader的运行机制

    主要介绍了Java中的Classloader的运行机制,包括从JVM方面讲解类加载器的委托机制等,需要的朋友可以参考下

    AndroidComponentPlugin:Android上简单实现四大组件的插件化,供学习使用

    插件化代码的编写,涉及到的知识点主要有java中的反射,动态代理,静态代理以及android中的AIDL跨进程通信,binder机制,ClassLoader加载机制,四大组件的运行原理等等。本项目代码主要参考和。在此基础上做了大量的...

    Android 使用classloader原理进行热更新

    使用Android的classloader加载器实现热更新,通过反射机制获取到源码的Elements数组替换classes.dex实现更新,只能重启软件进行更新,无法实现实时更新。

    Java 类加载机制详解

     二、类的加载机制  在Java中,采用双亲委派机制来实现类的加载。那什么是双亲委派机制?在Java Doc中有这样一段描述:  The ClassLoader class uses a delegation model to search for classes and resources

Global site tag (gtag.js) - Google Analytics