1.什么是类加载器?
Java类加载器(Java Classloader)是Java运行时环境(Java Runtime Environment)的一部分,负责动态加载Java类到Java虚拟机的内存空间中。
2.为什么要使用类加载器?
类通常是按需加载,即第一次使用该类时才加载。由于有了类加载器,Java运行时系统不需要知道文件与文件系统。
使用类加载器获取类对象,查看类对象的类加载器
代码测试:
@Test
public void test1(){
//通过类加载器获取对象
try {
//获取类对象
Class clazz=Class.forName("com.zking.entity.Person");
//获取类加载器
ClassLoader classLoader=clazz.getClassLoader();
ClassLoader classLoaderParent=classLoader.getParent();
ClassLoader classLoaderGrandParent=classLoaderParent.getParent();
//查询该类加载器的类型
System.out.println(classLoader);
System.out.println(classLoaderParent);
System.out.println(classLoaderGrandParent);
} catch (Exception e) {
e.printStackTrace();
}
}
3.类加载器的类型:
《1》应用类加载器App:加载自己写的列或者jar包下面的类
《2》扩展类加载器Ext:加载jdk/jre/lib/ext/下面的所有jar包
《3》根类加载器null:加载jdk/jre/lib/jar(所有类加载器的父加载器)
4.自定义类加载器:
实体类代码:
/**
* 自定义类加载器
* @author Administrator
*
*/
public class ClassLoaderDIY extends ClassLoader{
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
System.out.println("自定义类加载器");
System.out.println(name);
//所有的.替换成\
name=name.replaceAll("\\.", "/");
System.out.println("替换后:"+name);
//根据name找到桌面上 相对应的 person.class文件
String desktopPath="C:\\Users\\Administrator\\Desktop\\"+name+".class";
System.out.println(desktopPath);
try {
FileInputStream fis=new FileInputStream(desktopPath);
System.out.println(fis.available());
int len=0;
byte[] b=new byte[fis.available()];
len=fis.read(b);
return defineClass(null,b,0,len);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
测试代码:
@Test
public void test3() throws InstantiationException, IllegalAccessException{
//使用自己的类加载器 加载对象
try {
Class clazz=Class.forName("com.zking.entity.Person", true, new ClassLoaderDIY());
System.out.println(clazz.newInstance());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}