黑马程序员:类加载器
来源:互联网 发布:python 遍历嵌套字典 编辑:程序博客网 时间:2024/04/30 07:36
类加载器
java虚拟机中可以安装多个类加载器,系统默认主要有三个类加载器:BootStrap,ExtClassLoder,AppClassLoader(按从大到小的继承顺序排列),类加载器也是一个java类,也要被类加载器加载,所以第一个类加载器不是java类,BootStrap是用C++写的。
BootStrap:JRE/lib/rt.jar
ExtClassLoder:JRE/lib/ext/*.jar
AppClassLoader:CLASSPATH指定的所有jar或目录
当java虚拟机要加载一个类时,有3中情况:
1,用当前线程的类加载器去加载线程中的第一个类
2,如果类A中引用类B,java虚拟机将使用加载类A的类记载器去加载类B
3,直接调用ClassLoder.loadClass()方法指定某个类加载器去加载某个类每个类加载器加载类时,又先委托给其上级类加载器,运用委托机制:一层层向上委托,直到到达顶部类加载器,再开始查找类加载,找不到再移动到下一层查找类加载,到发起类加载器时,如果还是没有找到,就报ClassNotFoundException。
自定义类加载器
模版方法设计模式
父类已经把大体流程设计好了,子类们需要自己干的东西定义成一个抽象方法供子类覆盖,其他的公共的流程都继承于父类,都一样的。
写类加载器的原理:
1,自定义类加载器是继承ClassLoader,要覆盖ClassLoader的findClass方法,而不是loadClass方法,因为loadClass是向上委托,findClass是找类加载,如果覆盖loadClass,还要自己写向上委托代码。
2,通过覆盖的findClass方法得到要覆盖的类的Class文件的二进制数据
3,调用defineClass方法把二进制数据转换成字节码
import java.io.*;
public class MyClassLoader extends ClassLoader{
private String dirName;
public MyClassLoader(){}
public MyClassLoader(String dirName){
this.dirName = dirName;
}
private static void cypher(InputStream is,OutputStream os){
int a = -1;
try {
//对类的class文件的二进制数据进行解密
while((a = is.read())==-1){
os.write(a^0xff);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
// 得到类的路径
String classPath = dirName + "//" + name + ".class";
try {
FileInputStream fis = new FileInputStream(classPath);
ByteArrayOutputStream bao = new ByteArrayOutputStream();
//对类的class文件进行解密
cypher(fis,bao);
//得到正确的class文件的数据
byte[] b = bao.toByteArray();
//将正确的二进制数据加载到内存中
return defineClass(b, 0, b.length);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return super.findClass(name);
}
}
---------------------- android培训、java培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net/heima- 黑马程序员-类加载器
- 黑马程序员-类加载器
- 黑马程序员-类加载器
- 黑马程序员-类加载器
- 黑马程序员:类加载器
- 黑马程序员--类加载器
- 黑马程序员---类加载器
- 黑马程序员-----类加载器
- 黑马程序员-----类加载器
- 黑马程序员-类加载器
- 黑马程序员-类加载器
- 黑马程序员------类加载器
- 黑马程序员-类加载器
- 黑马程序员--类加载器
- 黑马程序员---类加载器
- 黑马程序员---类加载器
- 黑马程序员-类加载器
- 黑马程序员--类加载器
- SQL语句查处两表中,A表中的不再B表中存在的数据
- 三国智卡牌应用SanGuoCardCase(Windows Phone 7)项目 开发 - 序
- c#中Split分割字符串的几种方法
- 发现一个好的博客(C && C++)
- 为什么不让搜索"刘毅枫"
- 黑马程序员:类加载器
- 批量ping工具
- 【Delphi】简单测试虚拟方法表 VMT
- Windows打印体系结构简析与虚拟打印
- 打开电脑组策略
- 安装oracle 集群软件的时候报错 Error: OUI cannot be launched because the current working directory
- asp.net 笔记
- 从实例看struts2运行原理
- Rooting Android