文章目录
- 🍔什么是类加载器
- 🛸有哪些常见的类加载器
🍔什么是类加载器
负责在类加载过程中,将字节码信息以流的方式获取并加载到内存当中
🛸有哪些常见的类加载器
-
启动类加载器
启动类加载器是有Hotspot虚拟机通过的类加载器,加载核心类
默认加载Java安装目录 / jre / lib下面的类文件
-
扩展类加载器
扩展类加载器是jdk中提供的,是使用Java编写的类加载器,加载扩展类
默认加载Java安装目录 / jre / lib / ext 下的类文件
-
应用程序加载器
应用程序加载器是jdk中提供的,使用Java编写的类加载器,加载应用程序classpath下的类
-
自定义类加载器允许用户自行实现类加载的逻辑,可以从网络,数据库等来源加载类的信息
自定义类加载器需要继承ClassLoader抽象类,重写findClass方法
下面我们来写一个自定义类加载器
我们随便找一个class文件(不知在哪里找文件的同学可以参考这一篇文章 字节码文件)
我们使用jclasslib双击打开这个文件
可以看到这个类名位于固定目录下,不能被启动类加载器,扩展类加载器,应用程序加载器加载,所以我们选择自定义类加载器
代码如下
我们在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());
}
}
我们来到jclasslib里面看一下,发现如此
在技术的道路上,我们不断探索、不断前行,不断面对挑战、不断突破自我。科技的发展改变着世界,而我们作为技术人员,也在这个过程中书写着自己的篇章。让我们携手并进,共同努力,开创美好的未来!愿我们在科技的征途上不断奋进,创造出更加美好、更加智能的明天!