类加载器:
系统默认的三个: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