ClassLoader研究

http://blog.csdn.net/wan368500/article/details/8215668

 

https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=monline_3_dg&wd=%E8%87%AA%E5%AE%9A%E4%B9%89classloaderd%E8%AF%BB%E5%8F%96%E6%9F%90%E7%9B%AE%E5%BD%95jar%20ClassNotFoundException&oq=%E8%87%AA%E5%AE%9A%E4%B9%89classloaderd%E8%AF%BB%E5%8F%96%E6%9F%90%E7%9B%AE%E5%BD%95jar%20No%26lt%3BlassDefFound%26gt%3Brror&rsv_pq=f5382edb0009d8e7&rsv_t=bae4KnovGNtqP3brgNsMGEfQrN9LAAJX1wctPhXP0Th%2BO4RqrCvAW3WBwxNggGo8vKRB&rsv_enter=1&rsv_sug3=3&rsv_n=2&rsv_sug2=0&rsv_sug7=000&inputT=944&rsv_sug4=1179

 

ServletContext.getResource() 
如果使用ServletContext.getResource(path)方法,路径必须以"/"开始,路径被解释成相对于ContextRoot的路径,此处载入文件的方法和ClassLoader不同,举例"/WEB-INF/web.xml","/download/WebExAgent.rar"

ServletContext.class.getResource("/WEB-INF/classes");

 

 

2. 使用ClassLoader 

/** 
* 因为有3种方法得到ClassLoader,对应有如下3种方法读取文件 
* 使用的路径是相对于这个ClassLoader的那个点的相对路径,此处只能使用相对路径 
*/ 
InputStream is = null; 
is = this.getClass().getClassLoader().getResourceAsStream( 
"com/rain/config/sys.properties"); //方法1 
//is = Thread.currentThread().getContextClassLoader().getResourceAsStream( 
"com/rain/config/sys.properties"); //方法2 
//is = ClassLoader.getSystemResourceAsStream("com/rain/config/sys.properties"); //方法3

 

 

 

 

 

 

 

package com.zving.preloader;

 

 

import java.io.BufferedInputStream;

import java.io.File;

import java.io.FileInputStream;

 

import com.zving.framework.thirdparty.commons.io.ByteArrayOutputStream;

 

 

public class TestClassLoader extends ClassLoader {

    // 定义文件所在目录

    private static final String DEAFAULTDIR = "E:\\MyProjects\\workspace\\TestConsole\\bin\\";

    public Class<?> findClass(String name)

        throws ClassNotFoundException {

        byte[] b = null;

        try {

            b = loadClassData(GetClassName(name));

        } catch (Exception e) {

            e.printStackTrace();

        }

        return defineClass(name, b, 0, b.length);

    }

 

    @Override

    protected synchronized Class<?> loadClass(String name, boolean resolve)

        throws ClassNotFoundException {

        if (name.startsWith("java.")) {

            try {

                return super.loadClass(name, false);

            } catch (ClassNotFoundException e) {

                e.printStackTrace();

            }

        }

        byte[] b = null;

        try {

            b = loadClassData(GetClassName(name));

        } catch (Exception e) {

            e.printStackTrace();

        }

        return defineClass(name, b, 0, b.length);

    }

 

    private byte[] loadClassData(String filepath)

        throws Exception {

        int n = 0;

        BufferedInputStream br = new BufferedInputStream(new FileInputStream(new File(filepath)));

        ByteArrayOutputStream bos = new ByteArrayOutputStream();

        while ((n = br.read()) != -1) {

            bos.write(n);

        }

        br.close();

        return bos.toByteArray();

    }

 

    public static String GetClassName(String name) {

        System.out.println(DEAFAULTDIR + name.replace('.', '/') + ".class");

        return DEAFAULTDIR + name.replace('.', '/') + ".class";

    }

 

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值