自定义加载器问题

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加载 这是为什么 谁能告诉我呢
    }  

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值