【黑马程序员】java基础加强_类加载器

来源:互联网 发布:淘宝网电器商城 编辑:程序博客网 时间:2024/05/22 17:51

------- android培训、java培训、期待与您交流! ----------


类加载器(class loader),简单来说就是用于将java类加载到java虚拟机中。类加载器通过读取java字节码文件(.class),将其转换成Class类的实例,并且每个实例都可以用来表示一个java类。

系统提供的类加载器有三种:

BootStap--------------------->JRE/lib/rt.jar

ExtClassLoader------------>JRE/lib/ext/*.jar

AppClassLoader----------->CLASSPATH指定的所有jar或目录

除此之外,程序员还可以自定义加载器。


类的一般加载顺序为:AppClassLoader加载某类,先向ExtClassLoader提出请求,ExtClassLoader也先向BootStap提出请求,BootStap找到了就加载,没找到就还给ExtClassLoader,ExtClassLoader找到加载,没找到还给AppClassLoader,AppClassLoader找到加载,没找到报错。


所以如果我们写一个System类,但是我们在使用的时候,java虚拟机不会加载我们写的这个,而是加载rt包里面的System类

这个时候就要自定义加载类,让java虚拟机加载我们自定义的类。

package cn.itheima.test;    import java.io.ByteArrayOutputStream;  import java.io.FileInputStream;  import java.io.FileNotFoundException;  import java.io.IOException;    public class MyClassLoader {         public static void main(String[] args) {          // TODO Auto-generated method stub          ClassLoader cl = new ClassLoader() {                protected Class<?> findClass(String name) throws ClassNotFoundException {                  // TODO Auto-generated method stub                    FileInputStream fi = null;                  try {                      fi = new FileInputStream(name);                  } catch (FileNotFoundException e1) {                      // TODO Auto-generated catch block                      e1.printStackTrace();                  }                  ByteArrayOutputStream bo = new ByteArrayOutputStream();     //从自己的class文件里面读取数据                  int dat = -1;                  try {                      while ((dat = fi.read()) != -1) {                          bo.write(dat);                      }                  } catch (IOException e) {                      // TODO Auto-generated catch block                      e.printStackTrace();                  }                    try {                      if (fi != null) {                          fi.close();                      }                      if (bo != null) {                          bo.close();                      }                  } catch (IOException e) {                      // TODO Auto-generated catch block                      e.printStackTrace();                  }                  //返回字节码, 交给加载器                  return defineClass(name, bo.toByteArray(), 0, bo.toByteArray().length);              }            };      }    }  
这样 一个自定义的类加载器就完成了,这个类加载器还可以对class文件进行加密,这样就可以防止被其他人拿到字节码文件里面的参数或者方法。


0 0