類加載器:
系統默認的三個: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