自定义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);
        }
    }
}
自定义ClassLoader的更多相关文章
- 使用自定义 classloader 的正确姿势
		详细的原理就不多说了,网上一大把, 但是, 看了很多很多, 即使看了jdk 源码, 说了罗里吧嗦, 还是不很明白: 到底如何正确自定义ClassLoader, 需要注意什么 ExtClassLoade ... 
- Java Se:自定义ClassLoader
		JVM是如何知道java.lang包中的类的?JVM又是如何知道我们应用中的类的?我们的应用中明明是有某个类, 但是JVM却抛出ClassNotFoundException,这是为什么?XxxImpl ... 
- JAVA 利用JNI加密class文件/自定义ClassLoader 类
		利用 JNI 对bytecode 加密.不影响java程序员的正常开发.09年的时候写的,现在拿出来晒晒————————————————————————————混淆才是王道,如果混淆再加密就更酷了.. ... 
- 图解classloader加载class的流程及自定义ClassLoader
		图解classloader加载class的流程及自定义ClassLoader 博客分类: JVM JavaJVM虚拟机EXTSUN /** * 转载请注明作者longdick http://l ... 
- 解决自定义classloader后无法使用maven install
		@上篇博客中探讨了web项目利用自定义classloader进行解密,利用的是编译后的文件直接运行程序一切正常 今天博主在探讨加密后进行混淆时,打包程序报程序包org.apache.catalina. ... 
- 自定义classLoader思考
		jvm对于类实例的区分 基于完全限定名+classLoader 不同的classLoader可以加载同一class,生成不同实例, 但是这两个class实例生成的对象不能强转 spring boot ... 
- 自定义ClassLoader加载class文件
		package com.yd.wmsc.util; public class Test { public void say(){ System.out.println("Say Hello& ... 
- java自定义classloader引发的思考
		引用 java类的热替换 classloader机制 如下图所示,java的classloader是双亲委派机制.会首先从父classloader加载指定的class,如果加载不到才会从子classl ... 
- classloader加载class的流程及自定义ClassLoader
		java应用环境中不同的class分别由不同的ClassLoader负责加载.一个jvm中默认的classloader有Bootstrap ClassLoader.Extension ClassLoa ... 
随机推荐
- git 找回 git reset --hard HEAD 后的代码
			下面方法只针对当你本地代码做了 git add 或则 git commit 后又手贱的重置本地代码到上一个版本,导致本地代码丢失的情况. 如果你没有 git add 命令,而直接 git reset ... 
- [PHP] 商品类型规格属性后台管理(代码流程备忘)
			实现界面 涉及到四张表,type(商品类型表),type_spec(商品类型规格关联表),attribute(商品属性表),attribute_value(商品属性值表) 新建基控制器BaseCont ... 
- tomcat服务器访问网址组成
			运行tomcat服务器,其他设备访问的网址组成为: http://内网IP:端口/项目名字/网页名字.jsp 
- Tomcat配置JVM参数步骤
			这里向大家描述一下如何使用Tomcat配置JVM参数,Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个java虚拟机.您可以选择自己的需要选择不同的操作系统和对应的JDK ... 
- Notepad++怎么使用正则替换
			前言:工作中在oracle中写触发器的sql时,表字段有几十个,修改起来非常不方便,于是采用了Notepad++的替换 案例: 想把 v_update_time,v_create_time,v_rcv ... 
- 响应式布局和BootStrap 全局CSS样式
			1.什么是响应式布局 响应式布局是Ethan Marcotte在2010年5月份提出的一个概念,这个概念是为解决移动互联网浏览而诞生的. 简而言之,就是一个网站能够兼容多个终端——而不是为每个终端做一 ... 
- YII使用beanstalk队列
			转载于:http://blog.csdn.net/yao970953039/article/details/41821387 1.系统centos 我是直接使用yum install beanstal ... 
- JavaScript standard 代码规范的全文
			这是 JavaScript standard 代码规范的全文. 掌握本规范的最好方法是安装并在自己的代码中使用它. 细则 使用两个空格进行缩进. eslint: indent function hel ... 
- Vue 框架-07-循环指令 v-for,和模板的使用
			Vue 框架-07-循环指令 v-for,和模板的使用 本章主要是写一些小实例,记录代码,想要更详细的话,请查看 官方文档:https://cn.vuejs.org/v2/guide/#%E6%9D% ... 
- Oracle v$session/v$sql 表
			在本视图中,每一个连接到数据库实例中的 session都拥有一条记录.包括用户 session及后台进程如 DBWR, LGWR, arcchiver等等. V$SESSION中的常用列 V$SESS ... 
