`
YuHuang.Neil
  • 浏览: 187555 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java虚拟机中的类加载器的类型

阅读更多
所谓Java类加载器就是虚拟机用来将类加载在其内部的字节文件加载模块。Java虚拟机采用了父亲委托机制,这种机制能更好地保证Java平台的安全。在这种委托机制中,除了Java虚拟机自带的根类加载器以外,其余的类加载器都有且只有一个父加载器。加载器的加载逻辑是,加载器首先委托其父加载器去加载需要加载的类,若父加载器能够顺利加载此类,则加载工作全部交给父加载器完成,否则将由加载器自身去完成加载工作。

Java虚拟机自带的类加载器有如下三种类型:

1、根类加载器:这种加载器没有父加载器。它负责加载虚拟机的核心类库,如java.lang.*等等。同时,java.lang.Object就是由根加载器加载的。根类加载器从系统属性sun.boot.class.path所指定的目录加载类库。根类加载器的实现依赖于底层操作系统,属于虚拟机的实现一部分,它并没有继承java.lang.ClassLoader类。

2、扩展类加载器:它的父加载器是根加载器。扩展类加载器从java.ext.dirs系统属性所指定的目录加载类库,或者从JDK的安装目录的jre\lib\ext子目录下加载类库。如果将自定义的JAR文件包放在这个目录中也会自动被扩展类加载器加载。扩展类加载器是纯Java类,是java.lang.ClassLoader类的子类。

3、系统类加载器:也就是应用类加载器,它的父加载器就是扩展类加载器。它从环境变量classpath或者系统属性java.class.path所指定的目录中加载类,它是用户自定义的类加载器的默认父加载器。系统类加载器也是纯Java类,是java.lang.ClassLoader类的子类。


写了一个Java程序打印了当前系统的Java加载器的情况:


public class ClassLoadedSample{
        public static void main(String[] args){
                Class c;
                ClassLoader cl,cl1;
                cl=ClassLoader.getSystemClassLoader();
                System.out.println(cl);

                while(cl!=null){
                        cl1=cl;
                        cl=cl.getParent();
                        System.out.println(cl1+"'s parent is "+cl);
                }

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

                        c=Class.forName("ClassLoadedSample");
                        cl=c.getClassLoader();
                        System.out.println("Sample's loader is "+cl);
                }catch(Exception e){
                        e.printStackTrace();
                }
        }
}




打印结果是:

Lab-Computer-0db2f6:JavaExercises labuser$ javac ClassLoadedSample.java
Lab-Computer-0db2f6:JavaExercises labuser$ java ClassLoadedSample
sun.misc.Launcher$AppClassLoader@1ef6a746
sun.misc.Launcher$AppClassLoader@1ef6a746's parent is sun.misc.Launcher$ExtClassLoader@535ff48b
sun.misc.Launcher$ExtClassLoader@535ff48b's parent is null
java.lang.Object's loader is null
Sample's loader is sun.misc.Launcher$AppClassLoader@1ef6a746

注意:飘红的行表示了Java虚拟机为了安全使用了null来表示根类加载器,防止黑客利用根类加载器来加载非法类,从而破坏Java虚拟机的核心代码。

同样,java.lang.Object也是由根类加载器加载的,所以显示了null值。



分享到:
评论

相关推荐

    Java虚拟机JVM类加载初始化

    Java虚拟机JVM类加载初始化是Java程序运行过程中的关键环节,它负责将类的字节码文件加载到内存中并进行相应的处理,以便程序能够正确执行。在Java中,类加载器(Classloader)扮演着核心角色。下面将详细讨论类加载...

    深入java虚拟机.pdf

    类加载器子系统负责加载程序中的类型(类和接口),并赋予唯一的名字。执行引擎负责执行被加载类中包含的指令。数据区中保存了程序执行所需的信息,如字节码、被加载类的其他额外信息、程序中的对象、方法的参数、...

    深入Java虚拟机JVM类加载学习笔记

    在Java虚拟机(JVM)中,类加载器(ClassLoader)是负责将类的`.class`文件加载到内存中的重要组件。理解类加载器的工作原理对于深入掌握JVM以及解决实际开发中的问题至关重要。 **1.1 类加载器分类** 类加载器可以...

    Java虚拟机规范中文版(JavaSE7).pdf

    Java虚拟机的结构包括内存区域、执行引擎、类加载器系统等组件。内存区域主要分为堆、栈、方法区、本地方法栈和程序计数器等部分,每个都有特定的用途,例如,堆存储对象实例,栈处理方法调用,方法区存储类信息。...

    深入Java虚拟机_002_深入详解JVM之类加载器深度剖析、根、扩展及系统类加载器

    本部分我们将深入探讨JVM中的类加载器,特别是根类加载器、扩展类加载器和系统类加载器。 首先,让我们了解类加载的基本过程。当JVM启动时,会触发类加载。这个过程分为三个阶段:加载、链接和初始化。加载阶段,类...

    解析Java虚拟机中类的初始化及加载器的父委托机制共14页

    总结,理解Java虚拟机中类的初始化和加载器的父委托机制对于开发者来说极其重要。这不仅可以帮助我们编写更高效、安全的代码,也是解决一些疑难问题的关键。在实际编程过程中,我们应该灵活运用这些知识,以提升软件...

    Java虚拟机----类的加载过程.docx

    Java虚拟机(JVM)的类加载过程是Java程序运行的基础,它涉及到类加载器、类的生命周期和一系列复杂的步骤。在这个过程中,类加载器主要任务是根据类的全限定名加载二进制字节流并转化为`java.lang.Class`对象。整个...

    Java虚拟机工作原理详解

    * 可见性限制:下层的加载器能够看到上层加载器中的类,反之则不行,也就是说委托只能从下到上。 * 不允许卸载类:类加载器可以加载一个类,但是它不能卸载一个类。但是类加载器可以被删除或者被创建。 四、Java ...

    java类加载器实例

    类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一。它使得 Java 类可以被动态加载到 Java 虚拟机中并执行。类加载器从 JDK 1.0 就出现了,最初是为了满足 Java Applet 的需要而开发出来的。Java ...

    03Java虚拟机是如何加载Java类的1

    【Java虚拟机加载Java类的过程】 Java虚拟机(JVM)加载Java类的过程是一个关键的运行时机制,涉及三个主要步骤:加载、链接和初始化。这个过程确保了类的正确构造和执行。以下是对这些步骤的详细解释: 1. **加载...

    java应用程序类加载器,ClassLoader for java Application

    Java应用程序类加载器是Java平台的核心组成部分之一,它负责加载应用程序中的类到JVM(Java虚拟机)中,使得程序能够执行。理解类加载器的工作原理对于深入学习Java编程至关重要。在Java中,类加载器按照层次结构...

    Java虚拟机规范中文版.pdf

    Java虚拟机规范还定义了类加载机制,即在JVM启动时或运行过程中动态加载类到内存中。类加载器在运行Java程序时按需加载类,这允许Java程序进行延迟加载,即仅在需要时才加载类,这有助于优化程序的启动时间和运行时...

    Java虚拟机JVM类加载学习笔记

    JVM的类加载器(ClassLoader)负责将编译后的`.class`文件加载到内存中,为程序执行做好准备。当类被加载时,JVM会在内存的运行时数据区的方法区内存储类的信息,并在堆中创建一个`java.lang.Class`对象来封装这些...

    类加载器(java)

    Java中的类加载器是JVM(Java虚拟机)的核心组件之一,它们负责将.java源代码编译成的.class字节码文件加载到JVM中,从而使得程序能够运行。类加载器不仅涉及到程序的正常执行,还与Java的动态加载、模块化系统以及...

    java虚拟机

    JVM通过类加载器将这些字节码加载到内存中,进行验证、准备、解析和初始化等步骤,形成运行时的数据区。 2. **运行时数据区**:包括堆内存、方法区、虚拟机栈、本地方法栈和程序计数器。堆是所有对象实例的存储区域...

    java虚拟机的详细原理

    2. **引用类型**(Reference Types):包括类类型(Class Type)、接口类型(Interface Type)和数组类型(Array Type)。引用类型用来表示Java中的对象。 ### 结论 Java虚拟机是Java语言的核心,它为Java程序提供...

    Java虚拟机(Java VM) msjavax86 微软java虚拟机

    Java虚拟机的内部结构包括类装载器、运行时数据区、执行引擎、本地方法接口和本地库。其中,类装载器负责加载类文件,运行时数据区存储线程的工作数据,执行引擎解析并执行字节码,本地方法接口允许JVM调用非Java...

    Java虚拟机规范PDF

    JVM中的类加载器负责从文件系统或网络中加载Class文件到JVM内存中,其中Class文件是Java编译器编译后的结果。JVM类加载器有三个主要组成部分:启动类加载器、扩展类加载器和应用程序类加载器。 #### 3. 运行时数据...

Global site tag (gtag.js) - Google Analytics