如何打破双亲委派机制
先了解下双亲委派机制的原理:
调用关系如下:
ClassLoader中包含了4个核心方法,对Java程序员来说,打破双亲委派机制的唯一方法就是实现自定义类加载器重写loadClass方法,将其中的双亲委派机制代码去掉。
打破双亲委派机制的源码:
package q4classloader;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Field;
public class ItheimaClassLoader extends ClassLoader{
@Override
public Class<?> loadClass(String name) throws ClassNotFoundException {
if(name.startsWith("java.")){
return super.loadClass(name);
}
//com.itheima.springbootclassfile.pojo.vo.UserVO .class
String filename = name.substring(name.lastIndexOf(".") + 1) + ".class";
//加载 D:/jvm/data
byte[] bytes = new byte[0];
try {
bytes = FileUtils.readFileToByteArray(new File("D:\\教学\\同步课程资料\\BaiduSyncdisk\\实战Java虚拟机\\实战Java虚拟机\\代码\\day12\\jvm-interview\\target\\classes\\q4classloader\\" + filename));
} catch (IOException e) {
e.printStackTrace();
}
return defineClass(name,bytes,0,bytes.length);
}
public static void main(String[] args) throws ClassNotFoundException {
ItheimaClassLoader itheimaClassLoader = new ItheimaClassLoader();
Class<?> clazz = itheimaClassLoader.loadClass("q4classloader.PrintParentClassLoader");
//打印类字段
// Field[] declaredFields = clazz.getDeclaredFields();
// for (Field declaredField : declaredFields) {
// System.out.println(declaredField.getName());
// }
//打印类加载器名字
System.out.println(clazz.getClassLoader());
}
}
# 总结
双亲委派机制指的是:当一个类加载器接收到加载类的任务时,会自底向上交给父类加载器查找是否加载过,再由顶向下进行加载。
双亲委派机制的作用:保证类加载的安全性,避免重复加载。
打破双亲委派机制的方法:实现自定义类加载器,重写defineClass方法,将双亲委派机制的代码去除。
上次更新: 2025/03/09, 18:29:07