自定义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. git 找回 git reset --hard HEAD 后的代码

    下面方法只针对当你本地代码做了 git add 或则 git commit 后又手贱的重置本地代码到上一个版本,导致本地代码丢失的情况. 如果你没有 git add 命令,而直接 git reset ...

  2. [PHP] 商品类型规格属性后台管理(代码流程备忘)

    实现界面 涉及到四张表,type(商品类型表),type_spec(商品类型规格关联表),attribute(商品属性表),attribute_value(商品属性值表) 新建基控制器BaseCont ...

  3. tomcat服务器访问网址组成

    运行tomcat服务器,其他设备访问的网址组成为: http://内网IP:端口/项目名字/网页名字.jsp

  4. Tomcat配置JVM参数步骤

    这里向大家描述一下如何使用Tomcat配置JVM参数,Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个java虚拟机.您可以选择自己的需要选择不同的操作系统和对应的JDK ...

  5. Notepad++怎么使用正则替换

    前言:工作中在oracle中写触发器的sql时,表字段有几十个,修改起来非常不方便,于是采用了Notepad++的替换 案例: 想把 v_update_time,v_create_time,v_rcv ...

  6. 响应式布局和BootStrap 全局CSS样式

    1.什么是响应式布局 响应式布局是Ethan Marcotte在2010年5月份提出的一个概念,这个概念是为解决移动互联网浏览而诞生的. 简而言之,就是一个网站能够兼容多个终端——而不是为每个终端做一 ...

  7. YII使用beanstalk队列

    转载于:http://blog.csdn.net/yao970953039/article/details/41821387 1.系统centos 我是直接使用yum install beanstal ...

  8. JavaScript standard 代码规范的全文

    这是 JavaScript standard 代码规范的全文. 掌握本规范的最好方法是安装并在自己的代码中使用它. 细则 使用两个空格进行缩进. eslint: indent function hel ...

  9. Vue 框架-07-循环指令 v-for,和模板的使用

    Vue 框架-07-循环指令 v-for,和模板的使用 本章主要是写一些小实例,记录代码,想要更详细的话,请查看 官方文档:https://cn.vuejs.org/v2/guide/#%E6%9D% ...

  10. Oracle v$session/v$sql 表

    在本视图中,每一个连接到数据库实例中的 session都拥有一条记录.包括用户 session及后台进程如 DBWR, LGWR, arcchiver等等. V$SESSION中的常用列 V$SESS ...