链接:https://www.nowcoder.com/questionTerminal/0e1fa12fd45642bea3acde2c2e913b3f
来源:牛客网
深入探讨 Java 类加载器:https://www.ibm.com/developerworks/cn/java/j-lo-classloader/
Java类加载原理解析:http://www.blogjava.net/zhuxing/archive/2008/08/08/220841.html
eclipse插件开发 :http://www.blogjava.net/zhuxing/default.html
深入理解Java类加载器(一):Java类加载原理解析: /justloveyou_/article/details/72217806
双亲委派模型与线程上下文类加载器: https://blog.youkuaiyun.com/justloveyou_/article/details/72231425
类加载机制之Class.forName() [使用调用类的类加载器]:/yangguosb/article/details/77990131
真正理解线程上下文类加载器(多案例分析):/yangcheng33/article/details/52631940
1. 问题:
下面有关java类加载器,说法正确的是?
A. 引导类加载器(bootstrap class loader):它用来加载 Java 的核心库,是用原生代码来实现的
B. 扩展类加载器(extensions class loader):它用来加载 Java 的扩展库。
C. 系统类加载器(system class loader):它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类
D. tomcat为每个App创建一个Loader,里面保存着此WebApp的ClassLoader。需要加载WebApp下的类时,就取出ClassLoader来使用
答案:ABCD
2. Java中的类加载器
Java 中的类加载器大致可以分成两类,一类是系统提供的,另外一类则是由Java 应用开发人员编写的。系统提供的类加载器主要有下面三个:
引导类加载器(bootstrap class loader):
它用来加载 Java 的核心库,是用原生代码来实现的,并不继承自 java.lang.ClassLoader。主要负责jdk_home/lib目录下的核心api 或 -Xbootclasspath 选项指定的jar包装入工作(其中的jdk_home是指配置jdk环境变量是java_home的配置路径,一般是jdk/jre所在目录)。
扩展类加载器(extensions class loader):
它用来加载 Java 的扩展库。Java虚拟机的实现会提供一个扩展库目录,扩展类加载器在此目录里面查找并加载 Java 类,主要负责jdk_home/lib/ext目录下的jar包或 -Djava.ext.dirs 指定目录下的jar包装入工作。
系统类加载器(system class loader):
它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的。可以通过 ClassLoader.getSystemClassLoader()来获取它。主要负责CLASSPATH/-Djava.class.path所指的目录下的类与jar包装入工作.
除了系统提供的类加载器以外,开发人员可以通过继承java.lang.ClassLoader类的方式实现自己的类加载器,从而进行动态加载class文件,以满足一些特殊的需求,这体现java动态实时类装入特性。
除了引导类加载器之外,所有的类加载器都有一个父类加载器,通过getParent()方法可以得到。对于系统提供的类加载器来说,系统类加载器的父类加载器是扩展类加载器,而扩展类加载器的父类加载器是引导类加载器;对于开发人员编写的类加载器来说,其父类加载器是加载此类加载器 Java 类的类加载器。因为类加载器 Java 类如同其它的 Java 类一样,也是要由类加载器来加载的。一般来说,开发人员编写的类加载器的父类加载器是系统类加载器。类加载器通过这种方式组织起来,形成树状结构。树的根节点就是引导类加载器。下图中给出了一个典型的类加载器树状组织结构示意图,其中的箭头指向的是父类加载器。

java类加载机制


本文详细介绍了Java中的类加载机制,包括引导类加载器、扩展类加载器和系统类加载器的功能与职责。同时,还探讨了如何通过自定义类加载器实现动态加载class文件,以满足特定需求。
3675





