扩展类加载器的作用是什么?

  • Post category:Java

扩展类加载器是Java虚拟机内置的一种特殊的类加载器,其主要作用是加载Java虚拟机扩展目录中的类库。

Java虚拟机的扩展目录是指存放在 $JAVA_HOME/jre/lib/ext 目录下的jar包或类文件。这些类库中的类可以被应用程序访问和使用。扩展类加载器默认加载这个目录下所有的jar包文件和目录下的所有class文件。

使用扩展类加载器,我们可以很方便地加载扩展目录中的类,可以在实际开发中提高代码的复用性和灵活性。下面是两个示例:

示例1:加载扩展目录中的类库

假设我们现在要使用Apache Commons Lang 3这个类库中的StringUtils类来进行字符串操作。我们可以将commons-lang3-3.8.1.jar复制到$JAVA_HOME/jre/lib/ext目录下,然后在Java程序中就可以通过扩展类加载器来加载StringUtils类了。

import org.apache.commons.lang3.StringUtils;

public class MyClass {
    public static void main(String[] args) {
        String str = "  Hello, world!  ";
        System.out.println(StringUtils.trim(str)); //输出"Hello, world!"
    }
}

上述代码中,我们导入了Apache Commons Lang 3库中的StringUtils类,使用该类中的trim方法去除了字符串中的空格。

示例2:覆盖默认的类库

假设我们自己实现了一个MyUtils类,并将其打包成一个jar包,放在$JAVA_HOME/jre/lib/ext目录下。这个jar包中的类是用来做一些常用的小工具操作的,例如字符串的截取、日期的格式化、文件的拷贝等等。

如果我们覆盖了Java虚拟机默认的类库,实现了一些Java SE中缺少的功能,或者对已有功能进行了扩展,可以通过扩展类加载器来加载我们自己的实现类。

import com.example.MyUtils;

public class MyClass {
    public static void main(String[] args) {
        String str = "1234567";
        System.out.println(MyUtils.subString(str, 2, 4)); //输出"34"
    }
}

上述代码中,我们导入了自己实现的MyUtils类,使用该类中的subString方法截取了字符串的指定部分。这个功能是Java SE原生库中没有提供的,全靠我们自己实现才能使用。

扩展类加载器还有其他的一些应用场景,如在Java Web应用中加载应用服务器的共享库等,但以上两个示例已经很好地说明了扩展类加载器的作用和使用方法。