自定义ClassLoader的使用
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的使用的更多相关文章
- 使用自定义 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
自定义classloader MapleClassLoader package com.maple; import java.io.*; public class MapleClassLoader e ...
- 自定义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 ...
随机推荐
- 老猿学5G:3GPP和中国移动5G计费架构概览
☞ ░ 前往老猿Python博文目录 ░ 一.引言 老猿学5G这个专栏主要记录笔者因工作原因学习了解5G计费相关知识,文章按时间顺序循序渐进的介绍5G基础概念以及5G计费相关知识,该专栏前期已经完结, ...
- 第8.28节 Python中使用__setattr__定义实例变量和实例方法
一. 引言 根据前面章节介绍的内容,我们知道实例变量.实例方法的定义可以通过以下方法进行: 在类体中直接定义实例变量.实例方法: 在实例方法中定义实例变量.实例方法: 在类体外调用方使用赋值语句赋值定 ...
- PyQt(Python+Qt)学习随笔:Qt Designer中主窗口对象的animated属性
animated属性用于设置在操作可浮动部件和工具栏时是否设置动画. 当一个可浮动部件或工具栏被拖到主窗口上时,主窗口将调整其内容,以显示浮动部件或工具栏应该放置的位置.设置此属性后主窗口将使用平滑动 ...
- sql bool盲注
[CISCN2019 总决赛 Day2 Web1]Easyweb 考察: robots.txt image.php?bak文件泄露,image.php.bak可以下载别的不大行 盲注 php日志挂马 ...
- 第 4 篇 Scrum 冲刺博客
每天举行会议 会议照片: 昨天已完成的工作与今天计划完成的工作及工作中遇到的困难: 成员姓名 昨天完成工作 今天计划完成的工作 工作中遇到的困难 蔡双浩 实现收藏夹功能 实现重设计的个人界面功能 无 ...
- 数位DP复习笔记
前言 复习笔记第五篇.(由于某些原因(见下),放到了第六篇后面更新)CSP-S RP++. luogu 的难度评级完全不对,所以换了顺序,换了别的题目.有点乱,见谅.要骂就骂洛谷吧,原因在T2处 由于 ...
- 【题解】「CF1352A」Sum of Round Numbers
应该是纯模拟吧. 直接输入一个字符串,然后一位一位看,如果不是0,就 k++,并计算这个数的真实的值,最后输出就行了. #include<iostream> #include<cst ...
- 【无聊乱搞】如何用 std::set 过 gamma
一道毒瘤题 \(\gamma\) by DPair 题目描述 维护一个正整数集 \(S\),元素 \(\in\) 值域 \(U\),需要支持: \(\texttt{1 l r}\):\(S\gets ...
- CCF统一省选 Day2 题解
此题解是教练给我的作业,AK了本场比赛的人,以及认为题目简单的人可以不必看 T1 算法一 暴力枚举对信号站顺序的不同排列,然后对代价取\(\min\)即可. 时间复杂度\(O(m! \cdot n)\ ...
- elastic-job分布式调度与zookeeper的简单应用
一.对分布式调度的理解 调度->定时任务,分布式调度->在分布式集群环境下定时任务这件事 Elastic-job(当当⽹开源的分布式调度框架) 1 定时任务的场景 定时任务形式:每隔⼀定时 ...