深入理解JVM类加载器ClassLoader
classLoader类,它是一个抽象类,其后所有的类加载器都继承自classLoader(不包括启动类加载器)
方法 | 说明 |
---|---|
getParent() |
返回该类加载器的父类加载器。 |
loadClass(String name) |
加载名称为 name 的类,返回的结果是 java.lang.Class 类的实例。 |
findClass(String name) |
查找名称为 name 的类,返回的结果是 java.lang.Class 类的实例。 |
findLoadedClass(String name) |
查找名称为 name 的已经被加载过的类,返回的结果是 java.lang.Class 类的实例。 |
defineClass(String name, byte[] b, int off, int len) |
把字节数组 b 中的内容转换成 Java 类,返回的结果是 java.lang.Class 类的实例。这个方法被声明为 final 的。 |
resolveClass(Class<?> c) |
链接指定的 Java 类。 |
ClassLoader类关系:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zxkn8eFI-1599880114408)(C:\Users\Carlos\AppData\Roaming\Typora\typora-user-images\image-20200912105058882.png)]
sun.misc.Launcher
它是一个java虚拟机的入口应用。
类加载器树状组织结构示意图:
获取ClassLoader的途径:
- 方式一:获取当前类的ClassLoader
clazz.getClassLoader() - 方式二:获取当前线程上下文的ClassLoader
Thread.currentThread ().getContextClassLoader() - 方式三:获取系统的ClassLoader
classLoader.getSystemClassLoader() - 方式四:获取调用者的ClassLoader
DriverManager.getcallerClassLoader ()
代码演示如下:
package com.lbl.ClassLoaderTest02;
import java.sql.DriverManager;
public class ClassLoaderTest01 {
public static void main(String[] args) throws ClassNotFoundException {
//1.获取当前类的ClassLoader
Class<?> clazz = Class.forName("java.lang.String");
ClassLoader classLoader = clazz.getClassLoader();
//因为String是用引导类加载器加载的,所以获取不到,运行结果是:null
System.out.println(classLoader);//null
//2.获取当前线程上下文的ClassLoader
ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
System.out.println(contextClassLoader);//sun.misc.Launcher$AppClassLoader@18b4aac2
//3.获取系统的ClassLoader
ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
System.out.println(systemClassLoader);//sun.misc.Launcher$AppClassLoader@18b4aac2
}
}