2.
类加载器有委托机制,子类加载器先去找父类加载器调用父类加载器的loadClass(name),如果父类没有找到这个类,再调用子类加载器的loadClass()来加载这个类,然后子类加载器来调用findClass(name)来查找类,找到后再调用defineClass()来将一个 byte 数组转换为 Class 类的实例,这里注意的是自身不会向下找,只会向上找。所以我们写自己的类加载器时只需要重写findClass和defineClass就行。
例如:protected Class<?> findClass(String name) throws ClassNotFoundException {
String classPath = classDir +"\\"+name +".class" ;
FileInputStream fis = null;
try {
fis = new FileInputStream(classPath);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
cypher(fis, baos);
fis.close() ;
byte[] bytes = baos.toByteArray();
System.out.println("bbb");
return defineClass(bytes, 0, bytes.length);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
这里的name是需要加载的类的名字, classDir 为类所在的目录,这里用的是一个绝对路径,最后调用defineClass()方法。这样我们就定义了一个最简单的ClassLoader。