java类加载器如何被加载

java类加载器如何被加载

Java类加载器是用于加载Java类的一部分Java运行时系统。Java类可以从不同的来源加载,如本地文件系统,远程系统,路径,等等。类加载器遵循特定的顺序来加载类。首先,它会检查类是否已经加载。如果未加载,类加载器会委托父类加载器去加载该类。如果父类加载器无法加载该类,那么类加载器会尝试自己去加载该类。

这个过程涉及到了Java的委托模型。在Java的类加载器体系中,有三种主要的类加载器:引导类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)和应用类加载器(Application ClassLoader)。其中,引导类加载器是最顶层的父类加载器,主要用于加载Java核心类库,如rt.jar、resources.jar等;扩展类加载器和应用类加载器则是引导类加载器的子类,主要用于加载用户自定义类。

以下是详细的步骤和说明。

一、引导类加载器

引导类加载器(Bootstrap ClassLoader)是Java类加载体系中的最顶层父类加载器,它负责加载JRE的核心库(JAVA_HOME/jre/lib/rt.jar,resources.jar或sun.boot.class.path路径下的内容),无需依赖父类加载器。

在Java中,由于Bootstrap ClassLoader不是由Java实现的,所以在Java代码中通常看不到它,但是它却是实际存在的。

二、扩展类加载器

扩展类加载器(Extension ClassLoader)*是Bootstrap ClassLoader的子类,它负责加载JRE的扩展库(JAVA_HOME/jre/lib/ext/.jar)。

扩展类加载器是由sun.misc.Launcher$ExtClassLoader实现的。它同样是在JVM启动的时候创建,它的父类加载器是引导类加载器。

三、应用类加载器

应用类加载器(Application ClassLoader)是Extension ClassLoader的子类,它负责加载classpath指定的jar包和类路径。

应用类加载器是由sun.misc.Launcher$AppClassLoader实现的。它是JVM启动的时候创建,它的父类加载器是扩展类加载器。当用户调用Class.forName()方法时,默认使用Application ClassLoader加载类。

四、自定义类加载器

除了以上三种系统类加载器外,Java还允许我们自定义类加载器,只需要继承java.lang.ClassLoader类,并重写findClass(String name)方法即可。自定义类加载器可以让我们随意指定类加载的方式,比如从网络,数据库,甚至是动态生成。

在自定义类加载器时,需要注意以下两点:

  • 1、调用父类的loadClass方法,而不是findClass方法来实现类的加载。
  • 2、考虑类的唯一性。在Java中,一个类被认为是由类的完全限定名和加载此类的类加载器共同确定的。即使两个类来源于同一个Class文件,被同一个虚拟机加载,但只要加载它们的类加载器不同,那这两个类就必定不相等。

总的来说,类加载器的工作过程是一个父子层次结构,遵循“双亲委派模型”。这种模型保证了Java核心库的类型安全所有Java类都至少由一个类加载器进行加载。类加载器首先将Java类的字节码转化为Java虚拟机可以操作的内存中的Java类型,然后对这些类型进行验证、解析和初始化,最终形成可以被Java程序直接使用的Java类型。

相关问答FAQs:

1. 什么是Java类加载器?
Java类加载器是Java虚拟机(JVM)的一部分,负责将编译的Java类文件加载到内存中并转换为可执行的字节码。

2. Java类加载器是如何被加载的?
Java类加载器本身是由JVM在启动时加载的。JVM会根据一定的顺序加载不同类型的类加载器,如启动类加载器、扩展类加载器和应用程序类加载器。

3. Java类加载器的加载顺序是怎样的?
Java类加载器的加载顺序是由父子关系决定的。首先,启动类加载器(Bootstrap Class Loader)会加载JVM自身的核心类,然后扩展类加载器(Extension Class Loader)会加载Java扩展库中的类,最后应用程序类加载器(Application Class Loader)会加载应用程序的类。

4. Java类加载器加载类时有哪些重要的特点?
Java类加载器具有以下重要特点:

  • 双亲委派模型:类加载器会先委托给父类加载器尝试加载类,只有在父类加载器无法加载时才会自己尝试加载。
  • 类的唯一性:每个类加载器加载的类都具有唯一性,不同的类加载器加载同一个类会被视为不同的类。
  • 类的可见性:父类加载器加载的类对子类加载器是可见的,但子类加载器加载的类对父类加载器是不可见的。

5. Java类加载器的作用是什么?
Java类加载器的主要作用是将Java类加载到内存中,并为这些类提供运行环境。它负责加载、连接和初始化类,使得这些类可以被JVM执行。同时,类加载器也提供了类的隔离和版本管理的功能,确保不同的类之间不会相互干扰。

原创文章,作者:Edit1,如若转载,请注明出处:https://docs.pingcode.com/baike/341752

(0)
Edit1Edit1
上一篇 2024年8月15日 下午10:29
下一篇 2024年8月15日 下午10:29
免费注册
电话联系

4008001024

微信咨询
微信咨询
返回顶部