自定义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的更多相关文章

  1. 使用自定义 classloader 的正确姿势

    详细的原理就不多说了,网上一大把, 但是, 看了很多很多, 即使看了jdk 源码, 说了罗里吧嗦, 还是不很明白: 到底如何正确自定义ClassLoader, 需要注意什么 ExtClassLoade ...

  2. Java Se:自定义ClassLoader

    JVM是如何知道java.lang包中的类的?JVM又是如何知道我们应用中的类的?我们的应用中明明是有某个类, 但是JVM却抛出ClassNotFoundException,这是为什么?XxxImpl ...

  3. JAVA 利用JNI加密class文件/自定义ClassLoader 类

    利用 JNI 对bytecode 加密.不影响java程序员的正常开发.09年的时候写的,现在拿出来晒晒————————————————————————————混淆才是王道,如果混淆再加密就更酷了.. ...

  4. 图解classloader加载class的流程及自定义ClassLoader

    图解classloader加载class的流程及自定义ClassLoader 博客分类: JVM JavaJVM虚拟机EXTSUN /** *  转载请注明作者longdick    http://l ...

  5. 解决自定义classloader后无法使用maven install

    @上篇博客中探讨了web项目利用自定义classloader进行解密,利用的是编译后的文件直接运行程序一切正常 今天博主在探讨加密后进行混淆时,打包程序报程序包org.apache.catalina. ...

  6. 自定义classLoader思考

    jvm对于类实例的区分 基于完全限定名+classLoader 不同的classLoader可以加载同一class,生成不同实例, 但是这两个class实例生成的对象不能强转 spring boot ...

  7. 自定义ClassLoader加载class文件

    package com.yd.wmsc.util; public class Test { public void say(){ System.out.println("Say Hello& ...

  8. java自定义classloader引发的思考

    引用 java类的热替换 classloader机制 如下图所示,java的classloader是双亲委派机制.会首先从父classloader加载指定的class,如果加载不到才会从子classl ...

  9. classloader加载class的流程及自定义ClassLoader

    java应用环境中不同的class分别由不同的ClassLoader负责加载.一个jvm中默认的classloader有Bootstrap ClassLoader.Extension ClassLoa ...

随机推荐

  1. Redis 学习资料目录(Important)

    redis学习路线: 以下是整理的学习redis优秀博客和优秀网站 一.原理: 1. redis命令在线操作 http://try.redis.io/ 2. 中文命令解释: Redis 命令参考 - ...

  2. 【PyQt5 学习记录】010:QSplitter

    import sys from PyQt5.QtWidgets import (QApplication, QWidget, QSplitter, QTextEdit, QPushButton, QL ...

  3. curl 封装类

    <?php /** * author: zbseoag * QQ: 617937424 用法: $content = Curl::instance()->url($url)->get ...

  4. FineReport软件

    # FineReport常见问题与解答 ### FineReport是什么?FineReport,企业级web报表工具,中国报表软件知名品牌.借助于FineReport的无码理念,用户可以轻松的构建出 ...

  5. 原生爬虫小Demo

    import re from urllib import request class Spider(): url = 'https://www.panda.tv/cate/lol' #[\s\S]匹配 ...

  6. Keras & Theano 输出中间层结果

    Keras & Theano get output of an intermediate layer 1.使用函数模型API,新建一个model,将输入和输出定义为原来的model的输入和想要 ...

  7. JSON学习笔记-3

    JSON 对象 1.对象语法 JSON 对象使用在大括号({})中书写. 对象可以包含多个 key/value(键/值)对. key 必须是字符串,value 可以是合法的 JSON 数据类型(字符串 ...

  8. 普通用户查看Oracle参数的值

    create or replace function get_param(p_name in varchar2)return varchar2as  l_param_type number; l_in ...

  9. MongoDB用户配置

    MongoDB学习笔记—权限管理 阅读目录 1.MongoDB权限介绍 2 MongoDB添加管理员账户 3 MongoDB开启用户权限验证 4 MongoDB的roles角色简单介绍 5 Mongo ...

  10. leetCode之二叉树数中序遍历(递归实现)

    1.题目描述 2.分析 对于树来说,由于其结构是递归定义的,所以对二叉树很多算法使用递归是最容易的.反倒是使用循环方式需要借助特殊的数据结构来实现. 3.代码 vector<int> in ...