码迷,mamicode.com
首页 > 其他好文 > 详细

自定义Cass loader

时间:2019-07-12 14:23:40      阅读:88      评论:0      收藏:0      [点我收藏+]

标签:loader   des   name   vat   tst   nbsp   read   length   加载   

1、先建一个被加载的测试类

public class Person {

    private Integer age;

    public Integer getAge() {
        return age;
    }

    @Override
    public String toString() {
        return "测试类加载成功";
    }
}

  

2、建一个自定义的类加载器

继承ClassLoader类,重写findClass,这样不破坏Java的双亲委派机制。

    public class PathClassLoader extends ClassLoader{
        private String classPath;

        public PathClassLoader(){

        }

        public void setClassPath(String classPath) {
            this.classPath = classPath;
        }

        @Override
        protected Class<?> findClass(String className) throws ClassNotFoundException {
            byte[] classData = getClassByte(className);
            if(classData == null){
                throw new ClassNotFoundException();
            }
            return defineClass(className,classData,0,classData.length);
        }

        public byte[] getClassByte(String className) {
            String path = classPath + File.separator+ className.replace(".",File.separator) + ".class";
            InputStream inputStream = null;
            try {
                inputStream = new FileInputStream(path);
                ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
                byte[] buffer = new byte[1024];
                int length = 0;
                while ((length=inputStream.read(buffer)) != -1){
                    byteArrayOutputStream.write(buffer,0 ,length);
                }
                return byteArrayOutputStream.toByteArray();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
    }

  

3、测试类

    public static void main(String[] args) throws Exception {
        String classPath = "D:\\workspace\\idea\\fmdes\\target\\classes";
        PathClassLoader classLoader = new PathClassLoader();
        classLoader.setClassPath(classPath);
        String className = "com.fmys.api.test.Person";
        Class loadClass = classLoader.loadClass(className);
        System.out.println(loadClass.newInstance());

    }

  

4、结果会输出 测试类加载成功

 

自定义Cass loader

标签:loader   des   name   vat   tst   nbsp   read   length   加载   

原文地址:https://www.cnblogs.com/fillPv/p/11175700.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!