黑马程序--java自定义类加载器

-------------------------------------------android培训期待与您交流 -------------------------------------  

 

java和其他语言不同的是,Java是运行于Java虚拟机(JVM)。这就意味着编译后的代码是以一种和平台无关的格式保存的,而不是某种特定的机器上运行的格式。这种格式和传统的可执行代码格式有很多重要的区别。具体来说,不同于C或者C++程序,Java程序不是一个独立的可执行文件,而是由很多分开的类文件组成,每个类文件对应一个Java类。 另外,这些类文件并不是马上加载到内存,而是当程序需要的时候才加载。 类加载器就是Java虚拟机中用来把类加载到内存的工具。而且,Java类加载器也是用Java实现的。这样你就不需要对Java虚拟机有深入的理解就可以很容易创建自己的类加载器了。

 

自定义类加载器(继承ClassLoader,重写findClass()方法,loadClass保存了类加载器的委托机制,所有最好不要重写loadclass方法,在类加载器中如果loadclass找不到类会调用findclass方法继续查找)

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;
 
    //必须重写findClass方法
    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
       // TODO Auto-generated method stub
       String classFileName = classDir + "\\"  + name.substring(name.lastIndexOf('.')+1) + ".class";
       try {
           FileInputStream fis = new FileInputStream(classFileName);
           ByteArrayOutputStream  bos = new ByteArrayOutputStream();
           cypher(fis,bos);
           fis.close();
           System.out.println("aaa");
           byte[] bytes = bos.toByteArray();
           return defineClass(bytes, 0, bytes.length);
       } catch (Exception e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
       }
       return null;
    }
   
    public MyClassLoader(){
      
    }
   
    public MyClassLoader(String classDir){
       this.classDir = classDir;
    }
}

 

猜你喜欢

转载自liuhaifang.iteye.com/blog/1880414