深入理解JVM类加载器ClassLoader

深入理解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

    }
}

猜你喜欢

转载自blog.csdn.net/qq_37924905/article/details/108546988