黑马程序员——Java类加载器

---------------------- android培训java培训、期待与您交流! ----------------------

类加载器:

系统默认的三个:BootStrap,ExtClassLoader,AppClassLoader.类加载器自己本身也是类。

从属结构和使用范围

BootStrap——>JRE/lib/rt.jar

 

ExtClassLoader——>JRE/lib/ext/*.jar

 

AppClassLoader——>CLASSPATH指定的所有jar或目录

 

类加载器的委托机制:

当Java虚拟机要加载一个类时,到底派出哪个类加载器去加载呢?

    首先当前线程使用的类加载器去加载线程中的第一个类。

    如果类A中引用了类B,Java虚拟机将使用加载类A的类加载器来加载B.

   还可以直接调用ClassLoader.loadClass()方法来指定某个类加载器去加载某个类。

 

每个类加载器加载类时,又先委托给其上级类加载器。

每个ClassLoader本身只能分别加载特定位置和目录中的类,但它们可以委托其他的类装载器去加载类,这就是类加载器的委托模式。

 

类装载器一级级委托到BootStrap类加载器,当BootStrap无法加载当前所要加载的类的时候,然后才一级级回退子孙类装载器去进行真正的加载。

当回到最初的类装载器时,如果它自己也不能完成类的装载,那就报告ClassNotFoundException异常。

 

模板方法设计模式

 

父类——>loadclass/findclass/得到class文件转换成字节码——>defineClass()

注意:有包名的类不能调用无包名的类。

public  Class   findClass(String  name ){

   byte[ ]   b = loadClassData( name );

   return  defineClass(name,   b,   0,  b.length);

}

 

 

 

import java.util.Date;

 

publicclassClassLoaderAttachmentextends Date {

 

    public String toString(){

       return"hello ,itcast";

    }

}

 

publicclass MyClasLoaderextends ClassLoader{

 

    /**

     * @param args

     */

    //产生了一个加密的类文件,传入两个参数,srcPath,destDir

    //D:\Workspaces\MyEclipse10\javaenhance\bin\cn\itcast\day2\ClassLoaderAttachment.class

    //itcastlib

    publicstaticvoid main(String[] args)throws Exception{

       String srcPath = args[0];

      

       String destDir = args[1];

       //System.out.println("aaa");

       //参数倒是名字还是路径????

       FileInputStream fis = new FileInputStream(srcPath);

       //目标的名字

       String destFileName = srcPath.substring(srcPath.lastIndexOf('\\')+1);

       //目标的路径

       String destPath = destDir +"\\"+destFileName;

      

       FileOutputStream fos = new FileOutputStream(destPath);

       //System.out.println("aaa1");

       cypher(fis,fos);

       //System.out.println("aaa2");

       fis.close();

       fos.close();

      

    }

    //定义加密算法

    publicstaticvoid cypher(InputStream ips,OutputStream ops)throws Exception{

       int b= -1;

       while((b=ips.read())!=-1){

          ops.write(b* 0xff);//0-->1,1-->0

       }

    }

    private StringclassDir;

   

    @Override

    //prtected给子类用

    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 =newByteArrayOutputStream();

          //

          cypher(fis,bos);

          fis.close();

          System.out.println("myclasloader");

          byte[] bytes = bos.toByteArray();

          returndefineClass(bytes,0,bytes.length);

          

       } catch (Exception e) {

          //TODO Auto-generated catch block

          e.printStackTrace();

       }

       returnsuper.findClass(name);

    }

   

    public MyClasLoader(){

      

    }

    public MyClasLoader(String classDir){

       this.classDir= classDir;

      

    }

 

}

 

d

---------------------- android培训java培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net/heima
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章