`

classloader简介

    博客分类:
  • java
 
阅读更多

基础概念

        Classloder 类加载器,用来加载 Java 类到 Java 虚拟机中。与普通程序不同的是。Java程序(class文件)并不是本地的可执行程序。当运行Java程序时,首先运行JVM(Java虚拟机),然后再把Java class加载到JVM里头运行,负责加载Java class的这部分就叫做Class Loader。

 

       JVM本身包含了一个ClassLoader称为Bootstrap ClassLoader,和JVM一样,Bootstrap ClassLoader是用本地代码实现的,它负责加载核心JavaClass(即所有java.*开头的类)。另外JVM还会提供两个ClassLoader,它们都是用Java语言编写的,由Bootstrap ClassLoader加载;其中Extension ClassLoader负责加载扩展的Javaclass(例如所有javax.*开头的类和存放在JRE的ext目录下的类),Application ClassLoader负责加载应用程序自身的类。

 

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

 

注: 学ClassLoader看OSGI程序应用
什么时候JVM会使用ClassLoader加载一个类呢?当你使用java去执行一个类,JVM使用Application ClassLoader加载这个类;然后如果类A引用了类B,不管是直接引用还是用Class.forName()引用,JVM就会找到加载类A的ClassLoader,并用这个ClassLoader来加载类B。JVM按照运行时的有效执行语句,来决定是否需要装载新类,从而装载尽可能少的类,这一点和编译类是不相同的。
 
 
Why use your own ClassLoader?
似乎JVM自身的ClassLoader已经足够了,为什么我们还需要创建自己的ClassLoader呢?
因为JVM自带的ClassLoader只是懂得从本地文件系统加载标准的java class文件,如果编写你自己的ClassLoader,你可以做到:
1)在执行非置信代码之前,自动验证数字签名
2)动态地创建符合用户特定需要的定制化构建类
3)从特定的场所取得java class,例如数据库中
4) 等等
事实上当使用Applet的时候,就用到了特定的ClassLoader,因为这时需要从网络上加载java class,并且要检查相关的安全信息。
应用服务器大都使用了ClassLoader技术,即使你不需要创建自己的ClassLoader,了解其原理也有助于更好地部署自己的应用。
 
 
 
当你决定创建你自己的ClassLoader时,需要继承java.lang.ClassLoader或者它的子类。在实例化每个ClassLoader对象时,需要指定一个父对象;如果没有指定的话,系统自动指定ClassLoader.getSystemClassLoader()为父对象。
所以当创建自己的Class Loader时,只需要重载findClass()这个方法。
 
卸载重载
当一个javaclass被加载到JVM之后,它有没有可能被卸载呢?我们知道Win32有FreeLibrary()函数,Posix有dlclose()函数可以被调用来卸载指定的动态连接库,但是Java并没有提供一个UnloadClass()的方法来卸载指定的类。
在Java中,java class的卸载仅仅是一种对系统的优化,有助于减少应用对内存的占用。既然是一种优化方法,那么就完全是JVM自行决定如何实现,对Java开发人员来说是完全透明的。
在什么时候一个java class/interface会被卸载呢?Sun公司的原话是这么说的:"class or interfacemay be unloaded if and only if its class loader is unreachable. Classesloaded by the bootstrap loader may not be unloaded."
事实上我们关心的不是如何卸载类的,我们关心的是如何更新已经被加载了的类从而更新应用的功能。JSP则是一个非常典型的例子,如果一个JSP文件被更改了,应用服务器则需要把更改后的JSP重新编译,然后加载新生成的类来响应后继的请求。
其实一个已经加载的类是无法被更新的,如果你试图用同一个ClassLoader再次加载同一个类,就会得到异常(java.lang.LinkageError: duplicate classdefinition),我们只能够重新创建一个新的ClassLoader实例来再次加载新类。至于原来已经加载的类,开发人员不必去管它,因为它可能还有实例正在被使用,只要相关的实例都被内存回收了,那么JVM就会在适当的时候把不会再使用的类卸载。
使用线程上下文类加载器, 可以在执行线程中, 抛弃双亲委派加载链模式, 使用线程上下文里的类加载器加载类.
典型的例子有, 通过线程上下文来加载第三方库jndi实现, 而不依赖于双亲委派.
大部分java app服务器(jboss, tomcat..)也是采用contextClassLoader来处理web服务。
当然, 好东西都有利弊. 使用线程上下文加载类, 也要注意, 保证多根需要通信的线程间的类加载器应该是同一个, 防止因为不同的类加载器, 导致类型转换异常(ClassCastException).
分享到:
评论

相关推荐

    Understanding the Java ClassLoader

    ClassLoader简介** ClassLoader是Java运行时系统中的一个重要组成部分,但常常被开发者所忽视。它的主要职责是在运行时查找并加载类文件。通过创建自定义的ClassLoader,开发者可以定制JVM的行为,实现对类加载...

    类加载器文件

    #### 二、JDK简介 **JDK(Java Development Kit)**是Java语言的软件开发工具包(SDK)。JDK包含了Java运行环境(JRE)、Java编译器以及其他用于开发Java应用程序的工具。随着版本的发展,JDK经历了多个重要的变化。例如...

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

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

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

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

    Java反序列化回显解决方案.docx

    #### Java反序列化漏洞简介 Java序列化是指将对象的状态信息转换为可以存储或传输的形式的过程。相反,反序列化则是在适当的时候把这个流转换回原对象的过程。当应用程序接收来自不受信任源的数据并进行反序列化时...

    Dalvik源码

    Dalvik虚拟机简介** Dalvik是Google专门为Android设计的一种轻量级虚拟机,它基于寄存器架构,而不是传统的基于栈的虚拟机。这种设计使得Dalvik能够更好地适应移动设备的资源限制。在Android系统中,每个应用程序都...

    java反射机制

    #### 一、Java反射机制简介 Java反射机制是Java语言提供的一种强大特性,它使得程序可以在运行时动态地获取类的信息并直接操作对象的内部属性和方法。这种能力使得Java具备了一种动态语言的灵活性。 #### 二、Java...

    Java.lang.reflect 包下常用的类及方法简介

    - `newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)`:创建一个实现指定接口的代理实例。 通过上述类和方法,开发者可以实现诸如动态代理、序列化、元数据检查、运行时代码修改等...

    简谈jdk动态代理

    #### 三、类加载器简介 在`newProxyInstance`方法中,`ClassLoader`是一个非常重要的参数。Java中主要有三种类型的类加载器: 1. **Bootstrap ClassLoader**:这是最基础的类加载器,使用C++编写,主要用于加载Java...

    Java虚拟机简介.pdf

    标题中提到的“Java虚拟机简介”即为Java平台的核心组件之一的Java Virtual Machine(JVM)的介绍。JVM是运行Java字节码的虚拟机,能够跨平台运行Java程序。它负责解释Java程序中的字节码,将它们转换为在特定硬件...

    Java虚拟机类装载的原理及实现

    ##### 装载过程简介 **装载**是指将类或接口的二进制形式(通常为`.class`文件)导入到JVM中,并创建相应的`Class`对象的过程。这个过程通常包括三个主要步骤:装载、链接和初始化。 - **装载**:查找并导入类或...

    基于Android的JNI 简介与实现.zip

    **JNI(Java Native Interface)简介** JNI,全称为Java Native Interface,是Java平台标准的一部分,它为Java应用程序提供了一个接口,使得Java代码可以调用本地(非Java)代码,如C、C++或汇编语言编写的功能。...

    (转)java读取properties文件

    1. `properties`文件简介: `properties`文件是Java中的配置文件,它以键值对的形式存储数据,键和值之间用等号`=`或冒号`:`分隔。例如: ``` username=admin password=123456 ``` 2. `java.util.Properties`...

    JVM基础.doc

    #### 一、JVM概述与HotSpot简介 Java虚拟机(JVM)是Java技术的核心组成部分之一,它为Java程序提供了运行时环境。本节将详细介绍JVM的基本概念及其核心技术——HotSpot。 **HotSpot VM** 是Oracle公司提供的一个高...

    方立勋30天轻松掌握JavaWeb视频笔记

    - **Extension ClassLoader**:解析Extension ClassLoader的工作原理及其与系统类加载器的关系。 - **System ClassLoader**:阐述System ClassLoader的功能,包括如何加载应用程序类。 - **全盘负责委托机制**:深入...

    Java软件开发实战 Java基础与案例开发详解 2-5 java虚拟机简介 共8页.pdf

    ### Java虚拟机(JVM)简介 #### 一、Java虚拟机的概念 Java虚拟机(Java Virtual Machine,简称JVM)是Java技术的核心组成部分之一,在Java编程领域占据着至关重要的地位。简单来说,JVM可以被理解为一种通过软件...

    Android代码-android-advanced-decode

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

    JVM基础JVM基础JVM基础

    #### HotSpot简介 HotSpot作为Oracle(原属SUN)的主要Java虚拟机实现,自2006年起开源,并成为OpenJDK项目的核心组成部分。它主要使用C++编写,支持多种操作系统和硬件架构。HotSpot的一个显著特点是采用了解析器...

Global site tag (gtag.js) - Google Analytics