package com.hu.ClassLoader;
/*
* 测试类,然后自定义的类加载器去 加载该类
*/
public class ClassTest implements InterfaceTest{
@Override
public void name() {
System.out.println("tao");
}
@Override
public void age() {
System.out.println("21");
}
}
package com.hu.ClassLoader;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class MyClaLoader extends ClassLoader{
protected Class<?> findClass(String name) throws ClassNotFoundException {
try {
//需要加载的.class字节码的位置
String classPath="D:\\IOstream\\ClassTest.class";
FileInputStream fis=new FileInputStream(classPath);
ByteArrayOutputStream bos=new ByteArrayOutputStream();
cypher(fis, bos);
fis.close();
byte[] bytes=bos.toByteArray();
return defineClass(bytes, 0, bytes.length);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return super.findClass(name);
}
//相应的字节码解密类,在加载E盘根目录下的被加密过的ClassTest.class字节码的时候,进行相应的解密。
private static void cypher(InputStream in,OutputStream out) throws IOException{
int b=-1;
while((b=in.read())!=-1){
out.write(b^0xff);
}
}
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
Class clazz=new MyClaLoader().loadClass("com.hu.ClassLoader");
//这就是我们接口的作用。如果没有接口,就需要利用反射来实现了。
InterfaceTest classTest=(InterfaceTest) clazz.newInstance();
classTest.name();
classTest.age();
}
}
1. findClass是什么时候执行的? 他的执行顺序有点不明白。
2.new MyClaLoader().loadClass("com.hu.ClassLoader"); 后面com.hu.ClassLoader 可以随便改的,写成 a 都行,这个字符串表示什么意思啊?
|
|