您的位置:首页 > 其它

自定义加载器问题

2011-12-19 23:38 253 查看
mport java.io.ByteArrayOutputStream;  

import java.io.File;  

import java.io.FileInputStream;  

import java.io.InputStream;  

 

public class MyClassLoader extends ClassLoader{  

    private String name;//类加载器的名字  

    private String path = "F:\\";//加载类的路径  

    private static final String fileType = ".class";//文件的扩展名  

    public MyClassLoader(String name){  

        super();//显式地调用父类构造器,将该加载器的父加载器设置为默认的系统加载器  

        this.name = name;  

    }  

    public MyClassLoader(ClassLoader parent,String name){  

        super(parent);//设置该加载器的父加载器  

        this.name = name;  

    }  

    //将java文件中的数据存储到字节数组中  

    private byte[] loadClassData(String name){  

        byte[] data = null;//存储字节码  

        InputStream ips = null;  

        ByteArrayOutputStream baos = null;  

        try{  

            String cname = name.replace(".", "\\");//获取正确的路径格式  

            ips = new FileInputStream(new File(path+cname+fileType));  

            baos = new ByteArrayOutputStream();  

            int ch = 0;  

            while(-1 != (ch = ips.read()) ){  

                baos.write(ch);//从文件输入流中读取数据,将读到的数据写到字节数组输出流中  

            }  

            data = baos.toByteArray();  //将输出流中的中的数据存入到字节数组data中。

            ips.close();  

            baos.close();//关闭输入输出流  

        }catch(Exception ep){  

            ep.printStackTrace();  

        }  

        return data;  

    }

   

   

    //获取Class对象 ,在通过父类加载器检查所请求的类后,此方法将 loadClass 方法调用。

    public Class<?> findClass(String name) throws ClassNotFoundException

    //自己定义的加载器覆盖父类的findClass方法。是为了将.class 文件的数据转换成字节码。

    {  

     byte[] data = this.loadClassData(name); // 获得2进制数据。

        return this.defineClass(name, data, 0, data.length);   //将上述的2进制数据变成class 字节码。

    }  

    public String getPath() {  

        return path;  

    }  

    public void setPath(String path) {  

        this.path = path;  

    }  

    public String toString(){  

        return this.name;  

    }  

    //测试方法  

    public static void test(ClassLoader loader) throws Exception{  

        Class<?> c = loader.loadClass("First");  

        c.newInstance();  

    }  

    public static void main(String[] args) throws Exception {  

        MyClassLoader loader1 = new MyClassLoader("loader1");   //创建自己的类加载器名叫loader1

        loader1.setPath("F:\\myapp\\loader1\\");  

        MyClassLoader loader2 = new MyClassLoader(loader1,"loader2");  

        loader2.setPath("F:\\myapp\\loader2\\");  

      

        test(loader2);   //此时 如果F:\\myapp\\loader1\\ 下有First 就不会报错 如果 没有就会报错,而不会有loader2加载 这是为什么 谁能告诉我呢

    }  

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息