自定义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. [C#]简单离线注册码生成与验证

    本文使用RSA非对称加密和Base64简单地实现离线注册码的生成与验证功能. 主要思路就是提供者持有密钥,通过RSA加密客户机标识或时间标识,再通过Base64加密成不太难看的注册码,然后分发给客户机 ...

  2. IT农民的开发人员工具清单(2013年)

    IT行业日新月异,每天都不断变化着.作为一名混迹IT行业小有几个年头码农来说,不仅要时刻提高自身技术,也要不断更新自己开发工具.这些工具都是我吃饭的饭碗.饭碗旧了也是需要买个新的.转眼之间,已到201 ...

  3. ECLIPSE控制台信息导出

    JAVA代码: String fileAddress = Config.get_storeServiceLogsAsTextFile(); //获取信息的存放位置 //将控制台的信息保存到特定的文件中 ...

  4. javaweb中如何给自己的网站更改ico图标

    我们在查看网页的时候很多网站都有自己的小图标,系统读取这个标志的时候先从你的项目的根目录下读看有没有favicon.ico文件,如果有直接显示这个图标,如果没有,则会去webapps/root/下找这 ...

  5. AutoFac在项目中应用的体会

    AutoFac的工作原理就是:注册类并映射到接口,通过注入后返回相应实例化的类! 先来简单介绍下Autofac的使用      1.通过Nuget或代码安装autofac 安装autofac :ins ...

  6. 设计模式--单例模式(学习Learning hard大神笔记实践)

    根据大神博客园中的文章,自己亲手敲了一遍,对每个解说点都自己动手进行实践,收获颇丰,谢谢Learning hard大神,原文地址http://www.cnblogs.com/zhili/p/Desig ...

  7. 连接数据库 JDBC、DBCP、JNDI

    一.JDBC package com.direct.util; import java.sql.Connection; import java.sql.DriverManager; import ja ...

  8. C#(简单递归)和实现IComparable接口

    递归: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Syst ...

  9. linux基础学习之软件安装以及常用命令(三)

    添加和查看用户: [root@localhost ~]# useradd anderson [root@localhost ~]# cat /etc/passwd 显示如下: [root@localh ...

  10. thinkPHP3.2.2 控制器内跳转的三种方式

    public function jump() { $obj = new TestController(); $obj->logged(); } public function jump1() { ...