您的位置:首页 > 编程语言 > Java开发

Java--对于 class文件进行加密 然后通过我们自己写的类加载器进行加载指定类

2012-03-06 15:35 585 查看
2个类 A B ,如果A用到了B 那么就由A的那个类加载器来加载B



我们知道在java中所有的类都是通过类加载器来加载的 , 那么我们当然也可以自己写我们的类加载器 来家在我们指定的类 。

所有的 类加载器都要继承自ClassLoader这个类 , 并且覆盖findClass ,这个ClassLoader类 的loadClass会调用findClass方法来查找指定类 。

我们知道类加载器的加载原理是 自上而下 的树形 ,也就是先用 BootStrap ----> ExtClassLoader--->AppClassLoader---->如果这三个加载器都找不到的话 那么才会调用我们自己写的类加载器加载 class文件 。

对于Eclipse的相对目录是相对于Eclipse中的工程 ,绝对路径是指 class文件在磁盘上的完整存储路径

import java.io.ByteArrayOutputStream;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.InputStream;

import java.io.OutputStream;

import java.util.Date;

public class MyClassLoader extends ClassLoader

{

public static void main(String[] args) throws Exception

{



// Temp t=new Temp() ;

// FileInputStream fis=new FileInputStream("E:\\workspace\\TestNew\\bin\\Temp.class") ;

// FileOutputStream fos=new FileOutputStream("lib\\Temp.class") ;

// encript(fis,fos);



Class cls=new MyClassLoader("lib").loadClass("Temp") ;

Date dt=(Date)cls.newInstance() ;

System.out.println(dt.toString());

}

public static void encript(InputStream in,OutputStream out) throws Exception

{

int b=-1 ;

while((b=in.read())!=-1)

{

out.write(b^0xff) ;

}

}



@Override

protected Class<?> findClass(String name) throws ClassNotFoundException

{



String filePath=this.classDir+"\\"+name+".class" ;

try {

FileInputStream fis=new FileInputStream(filePath) ;

ByteArrayOutputStream bos=new ByteArrayOutputStream() ;

encript(fis,bos);

byte []bt=bos.toByteArray() ;

System.out.println("Load ing");

return defineClass(bt,0,bt.length) ;



} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return null;



}

private String classDir;

public MyClassLoader(String classDir)

{

this.classDir=classDir ;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐