自定义类加载器
1. 先定义一个类
/**
* 测试类加载器
*/
public class TestClassLoader {
public String key = "123456";
}
-
编译成.class文件 放到电脑某个目录下 我这里是放到e盘
3.` 自定义一个类加载器
public class MyClassLoader extends ClassLoader {private String clspath=“E:/”;
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
//先看看有没有加载此类 如果加载直接返回
Class<?> cls= findLoadedClass(name);
if (cls != null) {
return cls;
}
//如果没有加载类就让父类去加载
if(!name.endsWith(".TestClassLoader")){
return super.loadClass(name);
}
try {
InputStream inputStream = new FileInputStream(clspath +“TestClassLoader.class”);
byte[] bytes = IoUtil.readBytes(inputStream);
return defineClass(name, bytes, 0, bytes.length);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return super.findClass(name);
}}`
4 在main方法中测试
```java
public static void main(String[] args) {
MyClassLoader myClassLoader = new MyClassLoader();
try {
Class<?> cla = myClassLoader.findClass("com.study.vue2.studyJvm.TestClassLoader");
try {
Field field = cla.getDeclaredField("key");
field.setAccessible(true);
Object value = field.get(cla.newInstance());
System.out.print("字段的值"+value);
} catch (Exception e) {
e.printStackTrace();
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
5 结果 打印出来
6. 成功加载了 放在e盘下的.class文件并成功打印 字段的值
如果想打破双亲委派模型 要重写loadClass方法