问题:
1.将参数传递给loadClass(),内部会将参数传递给findClass()对吗?
2.下面的代码可以运行,高手帮忙看一下有什么欠缺的地方
-------------------------------------------------------
/*
* 需求:将一个类用自己的类加载器进行加密并加载
*
* 思路:
* 1.首先写一个简单的被操作的类:ClassLoaderAttachment
* 2.然后写自己的加载器:MyClassLoader 此类需要两个值:源文件srcPath和目的目录destDir
* 其中srcPath是包含文件名的决定路径,destDir只包含文件夹名,且为相对路径。所以要得出destPath.
* 通过输入输出流对要操作的类进行加密。
* 要覆盖findClass方法,不能覆盖loadClass方法,他其中的name有被调用后往loadClass方法传入
* 构造方法两个,一个带参数(classDir也就是上面的destDir),一个不带参数
* 3.由ClassLoderTest类调用MyClassLoader,并且将目的目录classDir和要操作的类ClassLoaderAttachment
* 传进去。
* */
public class ClassLoaderTest {
public static void main(String[] args) throws Exception{
Class cls = new MyClassLoader("itcastlib").loadClass("ClassLoaderAttachment");
Date d1 = (Date)cls.newInstance();
System.out.println(d1);
}
}
-------------------------------------------------------------------------
//我的加载器
public class MyClassLoader extends ClassLoader {
public static void main(String[] args)throws Exception {
String srcPath = args[0];
String destDir = args[1];
String destPath = destDir+"\\"+srcPath.substring(srcPath.lastIndexOf("\\"));
FileInputStream fis = new FileInputStream(srcPath);
FileOutputStream fos = new FileOutputStream(destPath);
cypher(fis,fos);
fis.close();
fos.close();
}
private String classDir;
@Override
protected Class<?> findClass(String name)
throws ClassNotFoundException{
String classFileName = classDir +"\\"+name+".class";
try {
FileInputStream fis = new FileInputStream(classFileName);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
//将class文件加载进来 进行解密
cypher(fis,bos);
fis.close();
byte[] bytes = bos.toByteArray();
return defineClass(bytes,0,bytes.length);
} catch (Exception e) {
e.printStackTrace();
}
return super.findClass(name);
}
//简单加密,加密和解密都用这一个方法
private static void cypher(InputStream ips,OutputStream ops)throws Exception{
int b=-1;
while((b=ips.read())!=-1){
ops.write(b ^ 0xff);
}
}
//空参数构造方法
public MyClassLoader(){
}
//有参构造方法
public MyClassLoader(String classDir){
this.classDir = classDir;
}
}
|
|