Java 中的类加载器大致可以分成两类,一类是系统提供的,另外一类则是由Java 应用开发人员编写的。
A 系统提供的类加载器主要有下面三个:
引导类加载器(bootstap class loader):
它用来加载 Java 的核心库,是用原生代码来实现的,并不继承java.lang.ClassLoader。主要负责jdk_home/lib目录下的核心api 或 -Xbootclasspath选项制定的jar包装入工作(其中的jdk_home是指配置jdk环境变量是java_home的配置路径,一般是jdk/jre所在目录)。
扩展类加载(extensions class loaser):
它用来加载Java的扩展库。Java虚拟机的实现会提供一个扩展库目录,扩展类加载器在此目录里里面查找并加载Java类,主要负责jdk_home/lib/ext目录下后者 -Djava.ext.dirs 指定目录下的jar包装入工作。
系统类加载器(system class loader):
它根据Java应用的类路径(CLASSPATH)来加载Java类,java应用的类都是有它来完成加载。可以通过ClassLoader.getSystemClassLoader()来获取它。主要负责CLASSPATH/-Djava.class.path所指的目录下的类与jar包装入工作。
B Java 应用开发人员编写
除了系统提供的类加载器以外,开发人员可以通过继承java.lang.ClassLoader类的方式实现自己的类加载器,从而进行动态加载class文件,以满足一些特殊的需求,这体现java动态实时类装入特性。
除了引导类加载器之外,所有的类加载器都有一个父类加载器,通过getParent()方法可以得到。对于系统提供的类加载器来说,系统类加载器的父类加载器是扩展类加载器,而扩展类加载器的父类加载器是引导类加载器;
对于开发人员编写的类加载器来说,其父类加载器是加载此类加载器 Java 类的类加载器。因为类加载器 Java 类如同其它的 Java 类一样,也是要由类加载器来加载的。一般来说,开发人员编写的类加载器的父类加载器是系统类加载器。类加载器通过这种方式组织起来,形成树状结构。树的根节点就是引导类加载器。下图中给出了一个典型的类加载器树状组织结构示意图,其中的箭头指向的是父类加载器。
关于类加载器,以下说法正确的是?
A. Java中类加载器一共有两种,系统类加载器和自定义类加载器;(系统和java开发人员编写)
B. 在自己的工程中定义类java.lang.Integer可以覆盖JDK中的类java.lang.Integer;(public final class Integer final 不能被继承)
C. 两个类加载器实例加载同一个类,会得到两个不同的类实例;
D. 为了保证安全性,java.lang.ClassLoader不可以被继承;(开发人员可以通过继承java.lang.ClassLoader类的方式实现自己的类加载器)