ClassLoader
一、 ClassLoader介绍
Java中的ClassLoader(类加载器)是负责将Java类文件
生成字节码文件加载为JVM中类对应的Class
的。字节码文件就是 *.class,文件内容本质就是一个字节数组
。所以说ClassLoader的主要作用是将Java类的字节码文件加载到JVM中,并生成对应的Class对象
,因此在每个Class对象中也会有一个标识指向是哪个ClassLoader加载的,由此可见,如果加载使用的是我们自己自定义的类加载器,那么在字节码文件加载到JVM这个阶段就可以实现一些特定的需求逻辑。
二、ClassLoader的分类
JVM 中有三个重要的内置ClassLoader:
-
BootstrapClassLoader
(根加载器):负责将\lib目录下的类库加载到虚拟机内存中,用来加载java的核心库。 -
ExtensionClassLoader
(扩展类加载器): 负责加载lib/ext或者由java.ext.dirs系统属性指定的目录中的JAR包的类。 -
AppClassLoader
(应用类加载器): 加载 Classpath 环境变量里定义的路径中的 jar 包和目录,自定义类加载器默认的父类加载器。
三、自定义类加载器
下面我们实现一个自己的自定义类加载器。
1. 创建Java类
public class MyClass {
public void hello() {
System.out.println("Hello");
}
}
2. 自定义ClassLoader
继承自ClassLoader
类,并重写findClass
方法。
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
public class CustomClassLoader extends ClassLoader {
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
try {
// 读取类文件的字节码内容
byte[] classData = Files.readAllBytes(new File(name + ".class").toPath());
//可以实现自定义需求
// 将字节码内容转换为Class对象
return defineClass(name, classData, 0, classData.length);
} catch (IOException e) {
throw new ClassNotFoundException("Class not found: " + name, e);
}
}
}
3. 测试自定义ClassLoader:
public class ClassLoaderDemo {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
CustomClassLoader classLoader = new CustomClassLoader();
// 使用自定义ClassLoader加载MyClass类
Class<?> myClass = classLoader.loadClass("MyClass");
// 创建MyClass的实例并调用hello方法
MyClass instance = (MyClass) myClass.newInstance();
instance.hello();
}
}
结果:
//Hello
上面,我们自定义了一个ClassLoader类CustomClassLoader,重写了findClass方法来加载类文件的字节码内容,并通过defineClass方法生成对应的Class对象。
总结
本文介绍了ClassLoader的知识、作用,并实现自定义了一个自定义类加载器。
希望对看到本文的你有帮助。
上一篇 理解Java的自定义类加载器ClassLoader看这一篇就够了!!! |
记得点赞收藏哦!!!
| 下一篇 java深拷贝与浅拷贝 |