Java的类加载器
作用
-
编译器先把java文件编译成class字节码文件
-
ClassLoad会把字节码文件转换成jvm中的Class对象
-
jvm再把class对象转成实例对象
-
ClassLoad在java 中有着非常重要的作用,他主要工作是在Class装载的加载过程,他的主要作用是 从系统外部获取二进制数据流。它是java的核心组件,所有的class都是通过ClassLoad进行加载的,ClassLoad负责将class文件里的二进制流输入到系统中交给jvm进行连接,初始化操作。
分类
系统自带的类加载器
- 启动类加载器(BootStrap) c++编写 加载核心库 java.*
- 拓展类加载器 (Extension) java编写 加载拓展库 javax.*
- 应用程序加载类(AppClassLoader)java编写 加载程序所在目录
用户自定义的类加载器
- 自定义类加载器 java编写 定制化加载
编写ClassLoad
- 我们先了解2个方法
- 这个方法是找类的 若没有找到就会报一个找不到类的异常 ,我们再来看一个方法
- 根据名称加载字节码对象返回class对象
- 先写一个 java文件
public class Test {
static {
System.out.println("hello smile");
}
}
- 编译之后获取 class文件
- javac 命令
- 开始编写ClassLoad
public class MyClassLoader extends ClassLoader {
private String path;
private String classLoaderName;
public MyClassLoader(String path, String classLoaderName) {
this.path = path;
this.classLoaderName = classLoaderName;
}
//用于寻找类文件
@Override
public Class findClass(String name) {
byte[] b = loadClassData(name);
return defineClass(name, b, 0, b.length);
}
//用于加载类文件
private byte[] loadClassData(String name) {
name = path + name + ".class";
InputStream in = null;
ByteArrayOutputStream out = null;
try {
in = new FileInputStream(new File(name));
out = new ByteArrayOutputStream();
int i = 0;
while ((i = in.read()) != -1) {
out.write(i);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
out.close();
in.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return out.toByteArray();
}
}
public class ClassTest {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
MyClassLoader test = new MyClassLoader("D:/", "myClassLoader");
Class c = test.loadClass("Student");
System.out.println(c.getClassLoader());
c.newInstance();
}
}