有些时候呢,当你对一个东西很熟悉了的时候,当你再重拾起这件东西的时候呢,你就有可能会有对其更深的理解,或者是想去更深的理解。.class文件被类加载器ClassLoader加载到内存,并被表示为Class对象,被JVM解析执行,那么,今儿,彻底来了解了解它的工作机制。
类装载器ClassLoader呢,就是寻找类或接口字节码文件(.class)进行解析并构造JVM内部对象表示的组件。类加载的工作由ClassLoader及其子类负责,它并非是一次性的加载多个class文件,需要的时候才才加载进来,这个就是我们常说的运行期间动态加载,如何想看看究竟类的具体加载过程呢,可以用-verbose:class参数,现看例子程序来了解了解ClassLoader何来个运行期动态加载,以后看看具体的加载过程,如下:
public class DynamicLoadClassDemo {
public static void main(String[] args) {
new WaitingToLoadedOneClass();
System.out.println("demonstrate dynamic loaded......");
new WaitingToLoadedTwoClass();
}
}
class WaitingToLoadedOneClass {
}
class WaitingToLoadedTwoClass {
}
看这个例子,里面有三个类,主类为DynamicLoadClassDemo,在main函数里,在声明两个对象之间有一条打印语句,如果ClassLoader是动态加载类的话,那么,输出的语句会在这两个类的加载中间对吧,为了能够看清楚这一过程,我们加上-verbose:class,在MyEclipse编辑窗口中,右击-->“Run As”-->“Open Run Dialog...”-->“Arguments”-->“VM arguments”,输入-verbose:class-->“Run”,会把类的加载如实的打印在控制台上,现截我们敢兴趣的运行结果如下:
[Loaded com.cui.hourse.reflectDemo.DynamicLoadClassDemo from file:/G:/workspace/HourseSystem/WebRoot/WEB-INF/classes/]
[Loaded com.cui.hourse.reflectDemo.WaitingToLoadedOneClass from file:/G:/workspace/HourseSystem/WebRoot/WEB-INF/classes/]
demonstrate dynamic loaded......
[Loaded com.cui.hourse.reflectDemo.WaitingToLoadedTwoClass from file:/G:/workspace/HourseSystem/WebRoot/WEB-INF/classes/]
完全的动态加载呀,输出语句,就在两个声明对象之间。
实际上呢,输的语句不仅仅是这些了,JVM在运行时会产生三个ClassLoader:根装载器、扩展类装载器(ExtClassLoader)、系统应用类装载器(AppClassLoader)。
现分别对这几个类的装载器说明如下:
1)根装载器(bootstrap class Loader):计算机本地语言所编写(汇编、C/C++),加载jre最核心的类,如JRE扩展目标下的rt.jar、charsets.jar...,如java.lang.String类;
2)扩展类装载器(extesion class loader):加载jre/lib/ext包里的jar类,如;
3)系统应用类装载器(applicatioin class loader):负责加载classpath路径下的包类,通常是用户定义的类,也是系统默认的装载方式;
JVM装载类时使用“全盘负责委托机制”。“全盘负责”是指当一个ClassLoader装载一个类时,该类所依赖及引用的类也由这个ClassLoader载入,当然了,别指定一ClassLoader除外;“委托机制”是指呢委托父装载器寻找目标类,只有找不到的情况下,才会从自己的当前路径下查找并装载目标类。就像AppClassLoader-->ExtClassLoader-->根装载器,这三个装载器之间存在着父子层级之间的关系,让我们来做个实验看看:
//根加载器,因为非Java语言所写,所以会返回null
System.out.println(String.class.getClassLoader());
//jre6\lib\ext包下dnsns.jar里的类,扩展类加载器加载
System.out.println(sun.net.spi.nameservice.dns.DNSNameService.class.getClassLoader());
//系统默认加载方式,应用类加载器,然后获取它的父加载器,一级一级的往上,分别为扩展类加载器、根加载器
System.out.println(ClassLoader.getSystemClassLoader());
System.out.println(ClassLoader.getSystemClassLoader().getParent());
System.out.println(ClassLoader.getSystemClassLoader().getParent().getParent());
控制台输出如下信息:
null
sun.misc.Launcher$ExtClassLoader@addbf1
sun.misc.Launcher$AppClassLoader@19821f
sun.misc.Launcher$ExtClassLoader@addbf1
null
完全与我们想像的一致,这样,你就理解了,呵呵!
分享到:
相关推荐
《深入Java虚拟机(七)深入源码看java类加载器ClassLoader》 Java类加载器(ClassLoader)在Java运行环境中扮演着至关重要的角色。它负责将类的字节码加载到Java虚拟机(JVM)中,使得程序能够运行。ClassLoader是...
Java 类加载器 ClassLoader 用法解析 Java 中的类加载器(ClassLoader)是一种机制,负责将类从文件系统、JAR 文件或网络等来源加载到 Java 虚拟机中。类加载器的作用是将类的二进制数据加载到内存中,并为其创建一...
### Java 类加载器详解 #### 一、类加载器概述 在Java中,类加载器(Class Loader)是一项核心机制,用于将字节码(.class文件)加载到JVM中,使其成为运行时的对象。类加载器不仅实现了类的加载功能,还确保了...
Java类加载器分为三种主要类型:引导类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)和应用程序类加载器(Application ClassLoader,也称为系统类加载器)。它们共同工作,确保了Java...
**java应用程序类加载器(ClassLoader for java Application)**: 当我们创建一个Java应用程序时,比如通过`java MainClass`命令启动,实际上是由应用程序类加载器来执行的。它查找并加载包含主类(Main-Class ...
2. **Extension ClassLoader** (扩展类加载器): 负责加载扩展类库,通常位于`JAVA_HOME/lib/ext`目录下的jar包。 3. **Application ClassLoader** (应用程序类加载器): 也称为系统类加载器,负责加载用户定义的类...
上述代码展示了如何创建一个自定义类加载器`MyClassLoader`,该类继承自`java.lang.ClassLoader`。`MyClassLoader`的主要功能是从文件系统中加载指定类的二进制数据。 - **构造函数**:接受一个父类加载器和基础...
### Java ClassLoader (类加载器)详解 #### 一、教程提示 如果你正在查看这份文档,在线版中你可以点击下面的任何主题直接跳转到相应的部分。 1. **教程提示** 2. **介绍** 3. **类加载器结构** 4. **编译类加载...
Java 类加载器原理 Java 类加载器是Java虚拟机(JVM)的核心组成部分,它负责将类的字节码加载到内存中并转换为可执行的Java类。类加载器的作用不仅仅是加载类,还包括确保类的唯一性,避免重复加载,并且遵循特定...
Java的ClassLoader类加载器机制 在 Java 虚拟机(JVM)中,类加载器(ClassLoader)扮演着非常重要的角色。类加载器负责加载 Java 类,包括核心类和用户自定义类。在 JVM 运行过程中,类加载器会形成一个层次结构,...
2. Extension ClassLoader:扩展类加载器,负责加载`<JAVA_HOME>/lib/ext`目录下的扩展类库,或者被`-Djava.ext.dirs`指定的路径中的类。 3. Application ClassLoader:也称为系统类加载器,负责加载用户类路径`-cp...
2. **Extension ClassLoader(扩展类加载器)**:它加载位于`JAVA_HOME/lib/ext`目录下的JAR包和用户指定的扩展目录下的类库。 3. **System ClassLoader(系统类加载器)**:也称为应用程序类加载器,它负责加载用户...
Java中的类加载器主要有三种:Bootstrap ClassLoader、Extension ClassLoader和App ClassLoader。它们按照双亲委派模型工作,从根加载器开始,逐级尝试加载类。当我们想要对类进行加密时,可以创建一个自定义的类...
2. **Extension ClassLoader**:扩展类加载器,负责加载`<JAVA_HOME>\lib\ext`目录下的JAR包,或者被`-Djava.ext.dirs`指定的路径中的类。 3. **System ClassLoader**:也称为应用类加载器,负责加载`CLASSPATH`...
类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一。它使得 Java 类可以被动态加载到 Java 虚拟机中并执行。类加载器从 JDK 1.0 就出现了,最初是为了满足 Java Applet 的需要而开发出来的。Java ...
**类加载器(ClassLoader)**是Java虚拟机(JVM)中的一个重要组成部分,它负责将编译好的`.class`文件加载到JVM中,使得这些类可以在Java环境中运行。类加载器不仅能够加载类,还能够根据不同的需求定制加载方式,如从...
在Java中,类加载器主要分为三个层次:Bootstrap ClassLoader、Extension ClassLoader和AppClassLoader。Bootstrap ClassLoader负责加载JDK的核心库,如rt.jar;Extension ClassLoader则加载JRE扩展目录下的jar文件...
Java的类加载器主要有Bootstrap ClassLoader、Extension ClassLoader和AppClassLoader。Bootstrap ClassLoader是JVM启动时的第一个类加载器,负责加载JDK的`<JAVA_HOME>/jre/lib`目录下的核心类库。Extension ...
【深入探讨 Java 类加载器】 Java 类加载器是Java虚拟机(JVM)的核心组成部分,它的主要任务是将Java类的字节码加载到JVM中以便执行。类加载器的概念始于JDK 1.0,最初是为了解决Java Applet在浏览器中的运行需求...