`
kankan1218
  • 浏览: 277668 次
  • 性别: 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类加载机制和原理详解

    双亲委派模型使得系统类(如java.*开头的类)由Bootstrap ClassLoader加载,而用户自定义类由应用程序类加载器(AppClassLoader)加载。这避免了类的冲突,保持了系统类库的稳定性。但有时我们可能需要打破这种模型...

    ClassLoader运行机制 自己写的

    在Java虚拟机(JVM)中,类加载器(ClassLoader)是至关重要的组成部分,它负责查找和加载类的字节码文件。理解ClassLoader的工作机制对于深入掌握Java应用程序的运行至关重要。这里我们将详细讨论ClassLoader的运行...

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

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

    ClassLoader类加载机制

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

    tomcat 类加载机制 —— ClassLoader

    《Tomcat类加载机制——ClassLoader详解》 在Java Web开发中,Tomcat作为最常用的Servlet容器,其类加载机制对于理解和优化应用性能至关重要。本文将深入探讨Tomcat的ClassLoader是如何工作的,以及它如何影响到...

    ClassLoader(类加载机制)1

    Java的类加载机制是其运行的核心部分,它涉及到如何将`.class`文件转换为内存中的类实例。在Java中,`ClassLoader`是负责这个过程的关键组件。本文将深入探讨ClassLoader的工作原理,Java类的结构,以及Java类的动态...

    理解Java ClassLoader机制

    最后,App ClassLoader加载的是应用类路径(ClassPath)中的类。 ClassLoader的工作流程主要包含以下步骤: 1. **查找类**:当JVM需要加载一个类时,ClassLoader会根据类名(全限定名,如`java.lang.String`)在...

    类加载机制ClassLoader

    在Java编程语言中,类加载机制(ClassLoader)是理解JVM(Java Virtual Machine)工作原理的关键部分。它负责将.class文件从磁盘加载到内存中,使得Java程序能够执行。这个过程包括加载、验证、准备、解析和初始化五...

    深入理解ClassLoader工作机制.docx

    《深入理解ClassLoader工作机制》 Java虚拟机(JVM)中的ClassLoader是负责加载类到内存中的核心组件。它不仅承担着将字节码转换为可执行对象的重任,还参与了类生命周期的各个阶段,包括加载、验证、准备、解析、...

    使用classloader动态加载Class

    2. **双亲委派模型**:Java的类加载机制遵循双亲委派模型,即当一个类加载器接收到加载类的请求时,它会先委托给父类加载器去加载,只有当父类加载器无法加载时,当前类加载器才会尝试自己加载。这种设计有助于防止...

    深入研究Java类加载机制 深入研究Java类加载机制

    例如,Bootstrap ClassLoader加载的核心类库不会被其他类加载器重新加载。 #### 五、自定义类加载器 虽然Java提供了默认的类加载器,但在某些情况下可能需要自定义类加载器来满足特定的需求,如实现热部署、动态...

    java的ClassLoader类加载器机制

    Java的ClassLoader类加载器机制 在 Java 虚拟机(JVM)中,类加载器(ClassLoader)扮演着非常重要的角色。类加载器负责加载 Java 类,包括核心类和用户自定义类。在 JVM 运行过程中,类加载器会形成一个层次结构,...

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

    Java ClassLoader机制是Java虚拟机(JVM)中一个至关重要的组成部分,它的主要任务是将类的.class文件加载到JVM中,使得程序能够运行。ClassLoader不仅负责类的加载,还涉及类的验证、初始化等一系列过程。理解...

    Java 类加载机制 ClassLoader Class.forName.pdf

    ### Java 类加载机制详解 #### 一、引言 Java 类加载机制是Java虚拟机(JVM)中的一个重要组成部分,它负责将编译后的字节码文件(.class)加载到内存中,形成Class对象,以便于Java程序能够识别并使用这些类。深入...

    Java ClassLoader定制实例

    在Java编程语言中,...然而,这也需要开发者对Java的内存管理和类加载机制有深入的理解,以便正确且安全地使用。通过研究"InternalsOfClassloadingSrc"这样的项目,我们可以更深入地学习和实践ClassLoader的定制。

    安卓App热门补丁动态修复框架.zip

    文章作者Github jiqimaogou类似项目 Nuwa这个项目涉及自动化那块做的很完整,感兴趣的可以去看看##详细说明 ### 制作该技术的帖子的原理很简单,其实就是用ClassLoader加载机制,覆盖掉有问题的方法。所以我们的帖子...

    ClassLoader动态加载dex

    通过分析这些源代码,我们可以更深入地理解如何实现ClassLoader的动态加载机制。 总结来说,Android的ClassLoader动态加载dex是一种高级技巧,它可以让我们在不更新整个APK的情况下实现功能更新。这涉及到对Android...

    JVM ClassLoader简析

    这种委托加载机制保证了类的唯一性,防止了同一个类被不同ClassLoader加载两次的问题。 ClassLoader还有自定义的概念,允许开发者创建自己的ClassLoader来实现特定的加载逻辑。例如,从网络、数据库或特定文件系统...

    译 Java类加载机制(二)

    Java类加载机制是Java平台设计的核心部分之一,它负责将.class文件从磁盘或网络中读取,并转换成运行时的Java对象。本篇将深入探讨这一机制的各个方面,包括类加载器、类加载过程以及双亲委派模型。 首先,我们要...

Global site tag (gtag.js) - Google Analytics