黑馬程序員——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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章