1 import java.io.ByteArrayOutputStream;
2 import java.io.File;
3 import java.io.FileInputStream;
4 import java.io.InputStream;
5
6 public class ClassLoaderTest extends ClassLoader {
7
8 private String classLoaderName;
9 private String fileExtension = ".class";
10
11 /**
12 * 默认的情况下,自定义类的加载器会以SystemClassLoader为父类加载器,如果要改变这种机制,调第二种生成方法
13 */
14
15 public ClassLoaderTest(String classLoaderName) {
16 super();
17 this.classLoaderName = classLoaderName;
18 }
19
20 public ClassLoaderTest(ClassLoader classLoader, String classLoaderName) {
21 super(classLoader);
22 this.classLoaderName = classLoaderName;
23 }
24
25 /**
26 * 该方法会在底层调用
27 */
28 @Override
29 protected Class<?> findClass(String className) throws ClassNotFoundException {
30 byte[] data = this.loadClassData(className);
31 return this.defineClass(className, data, 0, data.length);
32 }
33
34 // 在该示例里,不会执行该方法,也就是说,由于双亲委托机制,会由应用类加载器加载
35 // 如果加载的类,不在classpath里,意思就是应用类加载器加载不了,才会由此加载器加载
36 private byte[] loadClassData(String name) {
37
38 byte[] data = null;
39 InputStream is = null;
40 ByteArrayOutputStream baos = null;
41
42 try {
43 this.classLoaderName = this.classLoaderName.replace(".", "/");
44
45 is = new FileInputStream(new File(name + this.fileExtension));
46 baos = new ByteArrayOutputStream();
47
48 int ch = 0;
49
50 while (-1 != (ch = is.read())) {
51 baos.write(ch);
52 }
53 data = baos.toByteArray();
54
55 } catch (Exception e) {
56 e.printStackTrace();
57 } finally {
58 try {
59 is.close();
60 baos.close();
61 } catch (Exception e) {
62 e.printStackTrace();
63 }
64 }
65
66 return data;
67 }
68
69 public static void test(ClassLoader classLoader) throws Exception {
70 Class<?> clazz = classLoader.loadClass("类名");
71 Object o = clazz.newInstance();
72 System.out.println(o);
73 }
74
75 public static void main(String[] args) throws Exception {
76 ClassLoaderTest loader1 = new ClassLoaderTest("loader1");
77 test(loader1);
78 }
79
80 }
 

ps:同一个加载器的命名空间里,同一个类只能被加载一次

命名空间:由所有的父加载器和自己加载器组成的空间

只有由自定义类加载器的类才能被卸载

自定义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

    自定义classloader MapleClassLoader package com.maple; import java.io.*; public class MapleClassLoader e ...

  7. 自定义classLoader思考

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

  8. 自定义ClassLoader加载class文件

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

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

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

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

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

随机推荐

  1. k8s 部署 Java 项目

    前几天安装了 k8s 并测试了自动伸缩功能(HPA),今天来部署一个简单的 Java 应用到 k8s. 开始之前需要先安装一下 ingress 插件.ingress 作为 k8s 的流量入口,有多种实 ...

  2. 第9.12节 Python中其他文件操作方式

    一. 引言 本章老猿主要介绍了Python 内置io模块的文件操作相关功能,其实除了内置io模块可以进行文件操作外,Python的不同模块还提供了多种文件操作方式,下面简单将这些模块和方法介绍一下. ...

  3. PyQt(Python+Qt)学习随笔:QTreeWidgetItem项子项展开相关方法

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 树型部件QTreeWidget中的QTreeWidgetItem项如果一个项有子项,可以调用setE ...

  4. [GKCTF2020]cve版签到

    cve-2020-7066漏洞 利用get_header($url)函数漏洞%00对部分url截断 构造ssrf请求,用127.0.0.1网址访问目标主机内部资源 其实就是get_header()的C ...

  5. 一文看懂 Kubernetes 服务发现: Service

    Service 简介   K8s 中提供微服务的实体是 Pod,Pod 在创建时 docker engine 会为 pod 分配 ip,"外部"流量通过访问该 ip 获取微服务.但 ...

  6. 深入理解Java虚拟机(九)——后端编译与优化

    即时编译器 Java程序最初都是通过解释器进行执行,当发现某个方法或者代码块被运行得非常频繁,这些代码就被认为是热点代码,为了提高这些代码得运行效率,虚拟机会把热点代码编译成本地机器码,并进行优化,运 ...

  7. MySQL和sparkSQL合并行

    表A 表B 从表A到表B MySQL 写法:select name, group_concat(score seperate ';') as score from A group by name sp ...

  8. linux tar 压缩和解压缩

    tar -c: 建立压缩档案-x:解压-t:查看内容-r:向压缩归档文件末尾追加文件-u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个. 下面 ...

  9. react项目中对dom元素样式修改的另一种方法以及将组件插入到node节点中

    在项目中,以前如果遇到对dom元素的操作都是直接获取dom元素,比如说: 但是如果修改的样式比较多的话,不如直接"切换"dom元素,如下例子: 这样会节省一些性能.因为操作dom的 ...

  10. Java读取系统默认时区

    工作中,遇到一个Java读取默认时区的问题,后来看了openjdk的源码,大致整理一下过程 public class Test { public void test(){ TimeZone.getDe ...