面试连环call
- 双亲委派机制是什么?如何打破双亲委派机制?
- JVM都有哪些类加载器?
- 如何构造一个自定义类加载器?
- Tomcat的类加载机制?Spring的类加载机制
- Class.forName()和ClassLoader.loadClass()区别?
在开始讲述之前简单回顾一下之前的类加载过程
- 类加载过程:加载->连接->初始化。
- 其中连接过程又分为:验证->准备->解析。
具体内容大家可以看我上一篇关于类加载过程的详细介绍 Java类是如何被加载到内存中的?
类加载器作用
类加载器的主要作用就是加载 Java 类的字节码( .class
文件)到 JVM 中(在内存中生成一个代表该类的 Class
对象)。
字节码可以是 Java 源程序(.java
文件)经过 javac
编译得来,也可以是通过工具动态生成或者通过网络下载得来。
需要注意的是
-
类加载器是一个负责加载类的对象,用于实现类加载过程中的加载这一步。
-
每个 Java 类都有一个引用指向加载它的
ClassLoader
。 -
数组类不是通过
ClassLoader
创建的(数组类没有对应的二进制字节流),是由 JVM 直接生成的。
Class.forName()和ClassLoader.loadClass()区别?
- Class.forName(): 将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块
- ClassLoader.loadClass(): 只是将.class文件加载到jvm中,不会执行static中的内容, 只有在newInstance才会去执行static中内容
类加载器分类
-
启动类加载器
: Bootstrap ClassLoader,负责加载存放在JDK\jre\lib
(JDK代表JDK的安装目录,下同)下,或被-Xbootclasspath参数指定的路径中的,并且能被虚拟机识别的类库(如rt.jar,所有的java.*开头的类均被Bootstrap ClassLoader加载)。启动类加载器是无法被Java程序直接引用的。 -
扩展类加载器
: Extension ClassLoader,该加载器由sun.misc.Launcher$ExtClassLoader
实现,它负责加载JDK\jre\lib\ext
目录中,或者由java.ext.dirs
系统变量指定的路径中的所有类库(如javax.*开头的类),开发者可以直接使用扩展类加载器。 -
应用程序类加载器
: Application ClassLoader,该类加载器由sun.misc.Launcher$AppClassLoader
来实现,它负责加载用户类路径(ClassPath)所指定的类,开发者可以直接使用该类加载器,如果应用程序中没有自定义过自己的类加载器,一般情况下这个就是程序中默认的类加载器。
应用程序都是由这三种类加载器互相配合进行加载的,如果有必要,我们还可以加入自定义的类加载器。
标签:委派,类库,面试官,java,name,ClassLoader,双亲,加载 From: https://www.cnblogs.com/xieshijie/p/18285640