欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

手写类加载器演示 自定义加载类 (1) 创建一个新的 java 文件,并将其保存在适当的目录下。 (2) 使用 cmd 命令进入 world class 的父目录,运行 javac 命令生成 .class 文件。 (3) 创建自己定义的 classload 类。 // 继承 ClassLoader 类并覆盖 findclass 方法。 公共类 MyClassloader extends ClassLoader { private String path; private String classloaderName; private ClassLoader; classloaderName. public MyClassloader(String path,String classloaderName){ this. this.classloaderName = classloader

最编程 2024-03-09 10:41:53
...

 7、自定义loaderclass

(1)新建一个java文件,保存在相应的目录。

 (2)用cmd命令进入到world类的上级目录,运行javac命令,生成.class文件。

 (3)创建自己定义的classload类。

//继承ClassLoader类,重写findclass方法。
public class MyClassloader extends ClassLoader {

  private String path;
  private String classloaderName;

  public MyClassloader(String path,String classloaderName){
    this.path = path;
    this.classloaderName = classloaderName;
  }

  //用于寻找类文件
  @Override
  public Class findClass(String name){
    byte[] b =loadClassData(name);
    return defineClass(name,b,0,b.length);
  }

  public byte[] loadClassData(String name) {
    name = path + name + ".class";
    InputStream in = null;
    ByteArrayOutputStream out = null;

    try {
      in = new FileInputStream(new File(name));
      out = new ByteArrayOutputStream();
      int i = 0;
      while ((i = in.read()) != -1){
      out.write(i);
      }
    } catch (Exception e) {
      e.printStackTrace();
    }finally {
      try {
        out.close();
        in.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
    return out.toByteArray();
  }
}

(4)创建测试类,测试结果。

public class ClassLoderCheck {

  public static void main(String[] args)
      throws IllegalAccessException, InstantiationException, ClassNotFoundException {
    MyClassloader classloader = new MyClassloader("D:/jvm/", "myclasscloderz");
    Class c = classloader.loadClass("World");
    System.out.println(c.getClassLoader());
    System.out.println(c.getClassLoader().getParent());
    System.out.println(c.getClassLoader().getParent().getParent());
    c.newInstance();
  }
}

运行结果为:

 自定义类加载器的作用:jvm自带的三个加载器只能加载指定路径下的类字节码。如果某个情况下,我们需要加载应用程序之外的类文件呢?比如本地D盘下的,或者去加载网络上的某个类文件,这种情况就可以使用自定义加载器了。

参考网址:cnblogs.com/gdpuzxs/p/7044963.html

原文地址:https://www.cnblogs.com/shenwen/p/11589549.html

推荐阅读