黑马程序员:类加载器

来源:互联网 发布:python 遍历嵌套字典 编辑:程序博客网 时间:2024/04/30 07:36
---------------------- android培训、java培训、期待与您交流! ---------------------- 

类加载器

 

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
原创粉丝点击