扩展类加载器是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应用中加载应用服务器的共享库等,但以上两个示例已经很好地说明了扩展类加载器的作用和使用方法。