且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间:2022-08-13 08:18:07

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 ;
}



}