自定义ClassLoader

自定义classloader

MapleClassLoader

package com.maple;

import java.io.*;

public class MapleClassLoader extends ClassLoader {

    private String path = "E:\\Workspaces\\loader\\target\\classes\\";

    public MapleClassLoader(String path){
        this.path = path ;
    }

    public MapleClassLoader(ClassLoader parent,String path){
        super(parent);
        this.path = path;
    }


    /*@Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        byte[] data = loadClassData(name);
        return defineClass(name,data,0,data.length);
    }*/


    /*private byte[] loadClassData(String name) {
        try {
            name = name.replaceAll(".", "\\");
            FileInputStream is = new FileInputStream(new File(path + name + ".class"));
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            int b;
            while ((b = is.read()) != -1) {
                bos.write(b);
            }
            return bos.toByteArray();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }*/

    @Override
    public Class<?> loadClass(String name) throws ClassNotFoundException {
        try {
            String fileName = name.replaceAll("\\.", "\\/");
            FileInputStream is;
            try {
                is = new FileInputStream(new File(path + fileName + ".class"));
            } catch (Exception e) {
                is = null;
            }


            if (is == null) {
                return super.loadClass(name);
            }

            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            int b;
            while ((b = is.read()) != -1) {
                bos.write(b);
            }
            byte[] data = bos.toByteArray();

            return defineClass(name, data, 0, data.length);
        } catch (Exception e) {
            throw new ClassNotFoundException(name);
        }
    }
}

测试

public class Demo1 {

    public static void main(String[] args) throws Exception {
        MapleClassLoader mc = new MapleClassLoader(Thread.currentThread().getContextClassLoader(),"E:\\Workspaces\\loader\\target\\classes\\");
        Object obj = (Object)mc.loadClass("com.maple.Demo1").newInstance();
        System.out.println("load: "+ obj.getClass());
        System.out.println("local: "+ Demo1.NUM);
        System.out.println(obj instanceof Demo1);
    }

    private static int NUM = 1;

    private static Integer addNum(){
        return NUM++;
    }
}

测试结果

load: class com.maple.Demo1
local: 1
false

优化版ClassLoader


package com.maple.cl;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.net.URL;
import java.net.URLClassLoader;

/**
 * App Class Loader
 *
 * @author craneding
 * @date 16/1/28
 */
public class AppClassLoader extends ClassLoader {

    private String path = "E:\\Workspaces\\loader\\target\\classes\\";

    public AppClassLoader(String path) {
        super(ClassLoader.getSystemClassLoader());
        this.path = path;
    }

    public AppClassLoader(ClassLoader parent,String path) {
        super(parent);
        this.path = path;
    }

    @Override
    public Class<?> loadClass(String name) throws ClassNotFoundException {

        if (name.startsWith("com.maple.test.S") || name.startsWith("com.isuwang.org.apache.thrift") || name.startsWith("com.isuwang.dapeng.transaction.api")
                || name.startsWith("com.google.gson"))
            return ClassLoaderManager.shareClassLoader.loadClass(name);


        try {
            Class<?> c = findLoadedClass(name);
            if(c==null){
                String fileName = name.replaceAll("\\.", "\\/");
                FileInputStream is;
                try {
                    is = new FileInputStream(new File(path + fileName + ".class"));
                } catch (Exception e) {
                    is = null;
                }

                if (is == null) {
                    return super.loadClass(name);
                }

                ByteArrayOutputStream bos = new ByteArrayOutputStream();

                int b;

                while ((b = is.read()) != -1) {
                    bos.write(b);
                }

                byte[] data = bos.toByteArray();

                return defineClass(name, data, 0, data.length);
            }
            return c;
        } catch (Exception e) {
            throw new ClassNotFoundException(name);
        }

    }
}


posted @ 2017-12-31 13:06  枫叶maple  阅读(266)  评论(0编辑  收藏  举报