由於自己編寫的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進行解密然後加載運行