zoukankan      html  css  js  c++  java
  • 自定义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);
            }
    
        }
    }
    
    
    
  • 相关阅读:
    转载--php函数使用--var_export
    ZkApi的方法跨域访问ZkResource的静态资源文件出现的问题
    修改html内联样式的方法
    linux下的npm安装
    爬虫之静态网页爬虫(基础知识)
    利用jQuery使用HTML的formdata属性实现文件上传
    细说form表单
    session
    cookie和session(会话跟踪)
    同源策略和跨域问题
  • 原文地址:https://www.cnblogs.com/leihuazhe/p/8157506.html
Copyright © 2011-2022 走看看