黑马程序员技术交流社区

标题: 如何编写一个最简单的类加载器 [打印本页]

作者: 林国锋    时间: 2011-10-8 14:46
标题: 如何编写一个最简单的类加载器
在学习类加载器,请问如何编写一个最最简单的类加载器例子?
作者: 石宗银    时间: 2011-10-8 15:13
  1. // 根类加载器,加载的核心类库
  2.                  URL[] urls = sun.misc.Launcher.getBootstrapClassPath().getURLs();
  3.                  for (URL u : urls) {
  4.                  System.out.println(u);
  5.                  }
  6.                 // 扩展类 加载器,,加载的系统属性:java.ext.dirs 返回的路径下的 class
  7.                 System.err.println("扩展类(extention classLoader)加载器"
  8.                                 + ClassLoader.getSystemClassLoader().getParent());//非继承关系,只是意义上
  9.                 System.out.println(System.getProperty("java.ext.dirs"));
  10.                 // 应用(系统 application classLoader)类加载器,, 加载系统环境变量 PATH 或 CLASSPATH
  11.                 // 指定的JAR包和类路径
  12.                 System.err.println("应用(系统)类加载器" + ClassLoader.getSystemClassLoader());
  13.                 // System.out.println(System.getenv("PATH"));
  14.                 // System.out.println(System.getenv("CLASSPATH"));
复制代码

作者: 刘洋    时间: 2011-10-8 15:33
首先写一个自己的类加载器,MyClassLoader.java,继承ClassLoader类,然后重写findClass方法:
  1. package com.wyp12.myClassLoader;

  2. import java.io.ByteArrayOutputStream;
  3. import java.io.FileInputStream;
  4. import java.io.FileNotFoundException;
  5. import java.io.IOException;
  6. /**
  7. * 自己写一个类加载器 ,去加载"d:\myclass\com\wyp12\*.class"
  8. *
  9. * @author prince
  10. *
  11. */
  12. public class MyClassLoader extends ClassLoader {
  13.         private String name;
  14.         public MyClassLoader(String name) {
  15.                 super(); // 通过这个构造方法生成的类加载器,它的父加载器是系统类加载器
  16.                 this.name = name;
  17.         }
  18.         public MyClassLoader(String name, ClassLoader loader) {
  19.                 super(loader); // 通过这个这个构造方法生成的类加载器,该加载器的父加载器是loader,如果为空,则父加载器为根加载器
  20.                 // 子类继承父类,如果不显式写出调用父类的哪个构造方法,那么就默认调用父类的无参构造函数
  21.                 this.name = name;
  22.         }
  23.         public String toString()
  24.         {
  25.                 return this.name;
  26.         }
  27.         // 要重写findclass这个方法,loadclass会调用它
  28.          @Override
  29.         protected Class<?> findClass(String name) throws ClassNotFoundException {
  30.                 // TODO Auto-generated method stub
  31.                  byte[] data = null;
  32.                  FileInputStream fis = null;
  33.                 try {
  34.                         fis = new FileInputStream("d:\\myclass\\com\\wyp12\\myClassLoader\\"+name+".class");
  35.                 } catch (FileNotFoundException e) {
  36.                         e.printStackTrace();
  37.                 }
  38.                  ByteArrayOutputStream abos = new ByteArrayOutputStream();
  39.                  int ch = 0;
  40.                  try {
  41.                         while (-1!=(ch=fis.read()))
  42.                          {
  43.                                   abos.write(ch);        //把字节一个一个写到输出流中
  44.                          }
  45.                 } catch (IOException e) {
  46.                         e.printStackTrace();
  47.                 }
  48.                  data = abos.toByteArray();   //把输出流中的字节弄成一个字节数组
  49.                 return this.defineClass("com.wyp12.myClassLoader."+name,data, 0, data.length,null);
  50.            }
  51. }
复制代码
这个类加载器我让它默认加载d:\myclass\com\wyp12\myClassLoader路径下的class文件,具体文件名到时候我们构造实例的时候再给定,下面是测试类:
  1. import com.wyp12.myClassLoader.MyClassLoader;
  2. public class TestLoader {
  3.         public static void main(String[] args) throws Exception {
  4.                 MyClassLoader l1 = new MyClassLoader("loader1");
  5.                  Class dogC = l1.loadClass("Dog");
  6.                  dogC.newInstance();
  7.                 /*MyClassLoader l2 = new MyClassLoader("loader2",l1);  //把L1作为它的父加载器
  8.                 Class doccc = l2.loadClass("Dog");
  9.                 doccc.newInstance(); */
  10.         }
  11. }
复制代码
下面是要加载的类的源代码,很简答,就是让它打印出是谁加载了他
  1. package com.wyp12.myClassLoader;

  2. public class Dog {
  3.     public Dog()
  4.     {
  5.         System.out.println(this.getClass().getClassLoader());
  6.     }
  7. }
复制代码

作者: 林国锋    时间: 2011-10-8 15:46
刘洋 发表于 2011-10-8 15:33
首先写一个自己的类加载器,MyClassLoader.java,继承ClassLoader类,然后重写findClass方法:这个类加载器 ...

谢谢!!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2