----------------------
ASP.Net+Android+IOS开发、
.Net培训、期待与您交流! ----------------------
28, 高新技术——类加载器
28.1 什么是类加载器?类加载器的作用?
类加载器是加载类的工具,作用:将是类的字节码文件加载进内存.
Java虚拟机中可以安装多个类加载器,默认有三个类加载器:BootStrap、ExtClassLoader、AppClassLoader。类加载器其实其本身也是类,也需要被加载。所以,必须有第一个类加载器不是类,这个就是BootStrap,此类加载器嵌套在JVM中,JVM一启动就加载。
以下是类加载器的关系图:
类加载器的委托机制:
JVM默认用当前线程的当前类加载器去加载类,如果当前类加载器有父类加载器,则先从父类加载器查找,如果父类也有父类加载器,则依次往上查找直到最顶层父类加载器才开始查找要加载的类,如果最顶层父类加载器找到了,则加载进内存,如果没有找到就往下从子类加载器查找,依次往下直到发起者,就不再往下查找,如果没找到就会报错:ClassNotFoundException。这就类加载器的委托机制,简单说,就是先从发起者类加载器的父类加载器找,父类找不到再往回找子类加载器,直到发起者。
28.2 自定义类加载器
自定义类加载器必须要继承ClassLoader类,并覆盖findClass()方法。
如:
class MyClassLoader extends ClassLoader{//定义一个类继承ClassLoader类
private String classdir;
public MyClassLoader(){
}
public MyClassLoader(String classdir){
this.classdir=classdir;
}
//定义自己的加密解密算法.
public void cypher(InputStream is,OutputStream os)throws IOException{
int len=0;
while((len=is.read())!=-1){
os.write(len^3);
}
is.close();
os.close();
}
//覆盖ClassLoader类中的findClass方法.
@Override
protected Class<?> findClass(String name)throws ClassNotFoundException {
try {
FileInputStream fis=new FileInputStream(name);
ByteArrayOutputStream bos=new ByteArrayOutputStream();
fis.close();
intlen=0;
cypher(fis,bos);
byte[] data=bos.toByteArray();
Class clazz=defineClass(data,0,data.length);
return clazz;
} catch (FileNotFoundException e) {
//TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
return super.findClass(name);
}
}
自定义类加载器创建好后,就可以new 自定义类加载器对象,调用父类中的loadClass(String name),方法加载指定的类文件.
---------------------- ASP.Net+Android+IOS开发、 .Net培训、期待与您交流! ----------------------