自定义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 ...
随机推荐
- 【拓扑 && 模板】Kosaraju算法
#include<bits/stdc++.h> using namespace std; ; vector <int> g1[maxn],g2[maxn]; stack < ...
- 鼓捣phantomjs(二) node.js模块化集成
著作权所有:http://www.cnblogs.com/zeusro/ 引用(爬虫)不给稿费的,切你jj 追忆似屎年华 在上一篇post(http://www.cnblogs.com/zeusro/ ...
- DUBBO监控,设置接口调用数据的上报周期
目录 DUBBO监控,设置接口调用数据的上报周期 dubbo已有的监控方案 针对已有方案的改进 DUBBO监控,设置接口调用数据的上报周期 dubbo是目前比较好用的,用来实现soa架构的一个工具,d ...
- 第二节:Java开发环境的搭建
一.认识并安装JDK 1.JDK(Java Development Kit)是Java开发工具集,包括Java运行环境(JRE).Java开发工具以及一些基础类库,进行Java开发所必须安装的软件. ...
- 在 CentOS7 上安装 zookeeper-3.5.2 服务
[root@centos-linux src]# pwd /usr/local/src # 1.创建 /usr/local/src/zookeeper 文件夹 [root@centos-linux s ...
- Linux学习5-初学者注意事项
1.Linux严格区分大小写 2.Linux中所有内容以文件形式保存,包括硬件 硬盘文件是/dev/sd[a-p] 光盘文件是/dev/sr0等 3.Linux不靠扩展名区分文件类型, ...
- flask-login的使用3
# coding=utf-8 import flask app = flask.Flask(__name__) app.secret_key = 'super secret string' impor ...
- PHPCMS v9上传图片提示"undefined"的解决办法
把phpcms\modules\attachment\attachments.php中将 if(empty($this->userid)){改成 if(empty($_POST['userid' ...
- html基础-表格-列表(4)
今天准备为大家准备了表格和列表. 一.文章有各种数据的表格这个网页也不例外. (1).标签意思 <table>----------------------表格开始 <caption& ...
- js面向对象设计之class中一些坑和技巧
this的指向 super 类工厂,类中定义方法名时,可以使用字符串,这就可以创建工厂函数(类似模板类) Generator 函数 静态属性和私有属性.私有方法 new.target