由于自己编写的class类加密对类进行加密之后,系统的类加载器是无法加载的,此时需要自己编写一个简单的类加载器对自己的类进行加载操作,自己编写的类加载器必须继承ClassLoader,继承的作用是把自己的类加载器挂载到父类的加载器上面,然后覆盖父类的findClass方法
package javatribe.fts.generic;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
public class MyClassLoader extends ClassLoader{
/**
* @param args
*/
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
//源文件路径名
String srcPath=args[0];
//目标路径名
String destDir=args[1];
//获得输入流
FileInputStream fis=new FileInputStream(srcPath);
//获得目标的文件名,即加密之后的文件名称
String destFileName=srcPath.substring(srcPath.lastIndexOf('\\')+1);
//目标的路径,即加密之后文件传输到的路径
String destPath=destDir+'\\'+destFileName;
//输出流
FileOutputStream fos=new FileOutputStream(destPath);
//进行加密运算
cypher(fis,fos);
fis.close();
fos.close();
}
private static void cypher(InputStream ips,OutputStream ops) throws Exception{
int b=-1;
while((b=ips.read())!=-1){
ops.write(b ^ 0xff);
}
}
private String classDir;
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
// TODO Auto-generated method stub
String classFiledName=classDir +"\\"+ name.substring(name.lastIndexOf('.')+1) + ".class";
try {
FileInputStream fis=new FileInputStream(classFiledName);
ByteArrayOutputStream bos=new ByteArrayOutputStream();
cypher(fis,bos);
fis.close();
byte[] bytes=bos.toByteArray();
return defineClass(bytes, 0,bytes.length);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return super.findClass(name);
}
public MyClassLoader(){
}
public MyClassLoader(String classDir){
this.classDir=classDir;
}
}
/System.out.println(new ClassLoaderAttachment().toString());
Class clazz=new MyClassLoader("ftslib").loadClass("javatribe.fts.generic.ClassLoaderAttachment");
Date d1=(Date) clazz.newInstance();
System.out.println("!!!!!!!!!!"+d1);
如果把加密之后的ClassLoaderAttachment.class文件放置到和其它.class文件相同的目录
,此时会报错,因为系统的类加载器在加载我的.class的时候是无法解析的。那么为什么我的类加载器找到了自己加密的.class文件不进行加载,反而交给父类加载器,这就要考虑到加载器的优先级问题了,这就是类加载器的委托机制。当父类加载器找到了ClassLoaderAttachment.class会进行加载,这时候就会出错把ClassLoaderAttachment.class
删除了,父类加载器就找不到ClassLoaderAttachment.class,反而自己的加载器找到ClassLoaderAttachment.class,所以进行加载,这时候就会输出正确的结果。
以上就是自己简单的类加载器,对自己加密之后的.class进行解密然后加载运行