首先写一个自己的类加载器,MyClassLoader.java,继承ClassLoader类,然后重写findClass方法:- package com.wyp12.myClassLoader;
- import java.io.ByteArrayOutputStream;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.IOException;
- /**
- * 自己写一个类加载器 ,去加载"d:\myclass\com\wyp12\*.class"
- *
- * @author prince
- *
- */
- public class MyClassLoader extends ClassLoader {
- private String name;
- public MyClassLoader(String name) {
- super(); // 通过这个构造方法生成的类加载器,它的父加载器是系统类加载器
- this.name = name;
- }
- public MyClassLoader(String name, ClassLoader loader) {
- super(loader); // 通过这个这个构造方法生成的类加载器,该加载器的父加载器是loader,如果为空,则父加载器为根加载器
- // 子类继承父类,如果不显式写出调用父类的哪个构造方法,那么就默认调用父类的无参构造函数
- this.name = name;
- }
- public String toString()
- {
- return this.name;
- }
- // 要重写findclass这个方法,loadclass会调用它
- @Override
- protected Class<?> findClass(String name) throws ClassNotFoundException {
- // TODO Auto-generated method stub
- byte[] data = null;
- FileInputStream fis = null;
- try {
- fis = new FileInputStream("d:\\myclass\\com\\wyp12\\myClassLoader\\"+name+".class");
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- }
- ByteArrayOutputStream abos = new ByteArrayOutputStream();
- int ch = 0;
- try {
- while (-1!=(ch=fis.read()))
- {
- abos.write(ch); //把字节一个一个写到输出流中
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- data = abos.toByteArray(); //把输出流中的字节弄成一个字节数组
- return this.defineClass("com.wyp12.myClassLoader."+name,data, 0, data.length,null);
- }
- }
复制代码 这个类加载器我让它默认加载d:\myclass\com\wyp12\myClassLoader路径下的class文件,具体文件名到时候我们构造实例的时候再给定,下面是测试类:- import com.wyp12.myClassLoader.MyClassLoader;
- public class TestLoader {
- public static void main(String[] args) throws Exception {
- MyClassLoader l1 = new MyClassLoader("loader1");
- Class dogC = l1.loadClass("Dog");
- dogC.newInstance();
- /*MyClassLoader l2 = new MyClassLoader("loader2",l1); //把L1作为它的父加载器
- Class doccc = l2.loadClass("Dog");
- doccc.newInstance(); */
- }
- }
复制代码 下面是要加载的类的源代码,很简答,就是让它打印出是谁加载了他- package com.wyp12.myClassLoader;
- public class Dog {
- public Dog()
- {
- System.out.println(this.getClass().getClassLoader());
- }
- }
复制代码 |