【JVM篇】什么是类加载器,有哪些常见的类加载器-LMLPHP

🍔什么是类加载器

负责在类加载过程中,将字节码信息以流的方式获取并加载到内存当中

🛸有哪些常见的类加载器

  • 启动类加载器
    启动类加载器是有Hotspot虚拟机通过的类加载器,加载核心类
    默认加载Java安装目录 / jre / lib下面的类文件
    【JVM篇】什么是类加载器,有哪些常见的类加载器-LMLPHP

  • 扩展类加载器
    扩展类加载器是jdk中提供的,是使用Java编写的类加载器,加载扩展类
    默认加载Java安装目录 / jre / lib / ext 下的类文件
    【JVM篇】什么是类加载器,有哪些常见的类加载器-LMLPHP

  • 应用程序加载器
    应用程序加载器是jdk中提供的,使用Java编写的类加载器,加载应用程序classpath下的类
    【JVM篇】什么是类加载器,有哪些常见的类加载器-LMLPHP

  • 自定义类加载器允许用户自行实现类加载的逻辑,可以从网络,数据库等来源加载类的信息
    自定义类加载器需要继承ClassLoader抽象类,重写findClass方法

我们在pom文件中写入下面的代码

<dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.11.0</version>
        </dependency>
package org.JVM;

import org.apache.commons.io.FileUtils;

import java.io.File;
import java.io.IOException;
import java.lang.reflect.Field;

public class MyClassLoader extends ClassLoader{

    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException{

        //com . yupi . springbootinit . MainApplication .class
        String fileName = name.substring(name.lastIndexOf(".")+1)+".class";

        byte[] bytes=new byte[0];
        try {
            bytes= FileUtils.readFileToByteArray(new File("F:\\jvm\\data\\"+fileName));
        } catch (IOException e) {
            e.printStackTrace();
        }

        return defineClass(name, bytes, 0, bytes.length);
    }

    public static void main(String[] args) throws ClassNotFoundException {
        MyClassLoader myClassLoader = new MyClassLoader();

        Class<?> clazz =  myClassLoader.loadClass("com.yupi.springbootinit.MainApplication");

        //打印类的字段
        Field[] declaredFields = clazz.getDeclaredFields();
        for (Field field : declaredFields) {
            System.out.println(field.getName());
        }

        //打印类加载器的名称
        System.out.println(clazz.getClassLoader());
    }
}

【JVM篇】什么是类加载器,有哪些常见的类加载器-LMLPHP
我们来到jclasslib里面看一下,发现如此

【JVM篇】什么是类加载器,有哪些常见的类加载器-LMLPHP

02-19 07:34