2.1.3 类加载器的分类

类加载器的分类

分类

无论类加载器的类型如何划分,在程序中我们最常见的类加载器始终只有三个,如下所示:

image-20210730200638388

  • 启动类加载器

    • 负责加载JAVA_HOME/lib目录下的可以被虚拟机识别(通过文件名称,比如rt.jar``tools.jar)的字节码文件。
    • 与之对应的是java.lang.ClassLoader
  • 扩展类加载器

    • 负责加载JAVA_HOME/lib/ext目录下的的字节码文件。
    • 对应sun.misc.Launcher类 此类继承于启动类加载器ClassLoader
  • 应用程序类加载器

    • 负责加载ClassPath路径下的字节码 也就是用户自己写的类。
    • 对应于sun.misc.Launcher.AppClassLoader类 此类继承于扩展类加载器Launcher
  • 用户自定义加载器

    • 需要继承系统类加载器ClassLoader,并重写findClass方法。
    • 负责加载指定位置的字节码文件。通过类中的path变量指定。
    • 如下为用户重写的自定义加载器
      package cn.shaoxiongdu;
      
      import java.io.ByteArrayOutputStream;
      import java.io.File;
      import java.io.FileInputStream;
      import java.io.FileNotFoundException;
      import java.io.IOException;
      import java.io.InputStream;
      
      /**
       * @作者: 写Bug的小杜 【email@shaoxiongdu.cn】
       * @时间: 2021/07/30
       * @描述: 用户自定义类加载器
       */
      public class MyClassLoader extends ClassLoader {
          
          private String path="/home/lib/";    //默认加载路径
          
          private String name;                    //类加载器名称
          
          private final String  filetype=".class"; //文件类型
          
          
          public MyClassLoader(String name) {
              // TODO Auto-generated constructor stub
              super();
              this.name=name;
          }
          
          public MyClassLoader(ClassLoader parent,String name){
              super(parent);
              this.name=name;
          }
          
          @Override
          public Class<?> findClass(String name) throws ClassNotFoundException {
              // TODO Auto-generated method stub
              byte[] b=loadClassData(name);
              return defineClass(name, b, 0, b.length);
          }
          
          private byte[] loadClassData(String name) {
              byte[] data=null;
              InputStream in=null;
              name=name.replace('.', '/');
              ByteArrayOutputStream out=new ByteArrayOutputStream();
              try {
                  in=new FileInputStream(new File(path+name+filetype));
                  int len=0;
                  while(-1!=(len=in.read())){
                      out.write(len);
                  }
                  data=out.toByteArray();
              } catch (FileNotFoundException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
              } catch (IOException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
              }finally{
                  try {
                      in.close();
                      out.close();
                  } catch (IOException e) {
                      // TODO Auto-generated catch block
                      e.printStackTrace();
                  }
              }
              return data;
          }
          
          public String getPath() {
              return path;
          }
      
          public void setPath(String path) {
              this.path = path;
          }
          
          @Override
          public String toString() {
              // TODO Auto-generated method stub
              return this.name;
          }
      
      }
      
------本页内容已结束,喜欢请分享------

感谢您的来访,获取更多精彩文章请收藏本站。

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片