26_类加载
顾名思义,类加载器(class loader)用来加载 Java 类到 Java 虚拟机中。一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件)。类加载器负责读取 Java 字节代码,并转换成 java.lang.Class 类的一个实例。每个这样的实例用来表示一个 Java 类。通过此实例的 newInstance() 方法就可以创建出该类的一个对象。
类的加载过程
![](https://img.haomeiwen.com/i3135362/4ee898f3eb719c70.png)
=========类加载器:
![](https://img.haomeiwen.com/i3135362/eeb5972b95710521.png)
![](https://img.haomeiwen.com/i3135362/dbad3e69e466b6f8.png)
![](https://img.haomeiwen.com/i3135362/9310a39f988fd1c2.png)
![](https://img.haomeiwen.com/i3135362/e3339fb4b3347e21.png)
![](https://img.haomeiwen.com/i3135362/8d1c7f46708efb5c.png)
![](https://img.haomeiwen.com/i3135362/37af811d6655432d.png)
![](https://img.haomeiwen.com/i3135362/755b381f540aa7e6.png)
========classloader
所有的类加载器 除了 根类加载器 之外 都得继承 classloader
classloader 有4个主要方法
1=== loadclass 2==:findcalss 3:==defineclass 4reloerclass
![](https://img.haomeiwen.com/i3135362/b4a33aa77c676c90.png)
![](https://img.haomeiwen.com/i3135362/4049368ec9cf0ed0.png)
==========findClass
![](https://img.haomeiwen.com/i3135362/d3c070a3a33769d1.png)
========defineClass
![](https://img.haomeiwen.com/i3135362/0e7f762bdd63e6a7.png)
=====resolveClass
![](https://img.haomeiwen.com/i3135362/742aeb1d3f5ec5e0.png)
===========URLClassloader
![](https://img.haomeiwen.com/i3135362/5c454c58ca55db2c.png)
![](https://img.haomeiwen.com/i3135362/d643dda131511729.png)
demo1 加载磁盘类
1:创建Test 类
=================
public class Test {
public Test (){
System.out.println("666");
}
}
=================
2:创建 测试类
============
public class MyClass {
public static void main(String[] args)throws Exception {
File file=new File("e:/");
URI uri = file.toURI();
URL url = uri.toURL(); // 加载地址
URLClassLoader urlClassLoader=new URLClassLoader(new URL[]{url});
System.out.println("URLClassLoader父加载器"+urlClassLoader.getParent());
Class aClass = urlClassLoader.loadClass("Test");
aClass.newInstance();
}
}
============
=====自定义类加载器
1:继承类加载器
2: 覆盖findClass方法
=================================
// 1 继承ClassLoader
// 2
public class MyClassloadextends ClassLoader {
private Stringdictory; //被加载类所在目录
public MyClassload(String dictory) {// 默认加载器是系统类加载器
this.dictory = dictory;
}
public MyClassload(ClassLoader parent, String dictory) {
super(parent);
this.dictory = dictory;
}
@Override
protected ClassfindClass(String name)throws ClassNotFoundException {
// 把类名转为目录
String file =dictory + File.separator + name.replace(".", File.separator) +".class";
try {
// 构建输入流
InputStream ins =new FileInputStream(file);
// 构建输出流
ByteArrayOutputStream baos =new ByteArrayOutputStream();
byte[] bytes =new byte[1024];
int len = -1;
while ((len = ins.read(bytes)) != -1) {
baos.write(bytes, 0, len);
}
byte data[] = baos.toByteArray();// 读取到字节吗的二进制数据
ins.close();
baos.close();
return defineClass(name,data,0,data.length);
}catch ( Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
public static void main(String[] args)throws Exception {
MyClassload myClassload=new MyClassload("e:/");
Class test = myClassload.loadClass("Test");
test.newInstance();
}
}
=================================
自定义网络类加载器
![](https://img.haomeiwen.com/i3135362/51f3d4b568858b40.png)
![](https://img.haomeiwen.com/i3135362/706abd14e7f2882e.png)
![](https://img.haomeiwen.com/i3135362/21f1fd9b8a9250ea.png)
![](https://img.haomeiwen.com/i3135362/f1548acef109576b.png)
![](https://img.haomeiwen.com/i3135362/e802fa38f97fc7b1.png)
![](https://img.haomeiwen.com/i3135362/902b1461dc8f40ca.png)