classload加载外部class

1.    实现一个ClassLoad继承类

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.*;

/**
 * Created by CHENWENJUN431 on 2017-03-24.
 */
public class ExtendelClassLoad extends ClassLoader {

    private static final Logger logger = LoggerFactory.getLogger(ExtendelClassLoad.class) ;

    private String rootDirPath ;

    public ExtendelClassLoad (String rootDirPath) {
        this.rootDirPath = rootDirPath;
    }

    private byte[] getClassData(String className) {
        String path = rootDirPath + File.separatorChar + className.replace(".",File.separator) + ".class";

        try{
            InputStream ins = new FileInputStream(path) ;
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            int buffersize = 4096;
            byte[] buffer = new byte[buffersize];

            int readtemp = 0;
            if((readtemp = ins.read(buffer)) != -1 ) {
                baos.write(buffer,0,readtemp);
            }
            return baos.toByteArray();
        }catch (FileNotFoundException e) {

        }catch (IOException e) {

        }
        return null;

    }

    protected Class<?> findClassByName (String className) throws ClassNotFoundException {
        byte[] classData = getClassData(className);

        if(classData == null) {
            throw new ClassNotFoundException();
        }
        return defineClass(className,classData,0,classData.length);

    }

}

2.    调用

ExtendelClassLoad ecl = new ExtendelClassLoad("D:\\hiapfe\\hiap-fe\\work");
Class c = ecl.findClassByName("packagename.classname");
c.getDeclaredMethod("printSomth",String.class).invoke(c.newInstance(),"what");

 

注意的地方,如果java中包含包名字的话,需要在编译class路径中加上包体结构。心疼自己。。。

 

转载于:https://my.oschina.net/u/3021780/blog/866345

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值