Java类加载器(二)——自定义类加载器
来源:互联网 发布:淘宝店铺密码忘了 编辑:程序博客网 时间:2024/05/17 08:59
用户定制自己的ClassLoader可以实现以下的一些应用:
- 自定义路径下查找自定义的class类文件,也许我们需要的class文件并不总是在已经设置好的Classpath下面,那么我们必须想办法来找到这个类,在这种清理下我们需要自己实现一个ClassLoader。
- 确保安全性:Java字节码很容易被反编译,对我们自己的要加载的类做特殊处理,如保证通过网络传输的类的安全性,可以将类经过加密后再传输,在加密到JVM之前需要对类的字节码在解密,这个过程就可以在自定义的ClassLoader中实现。
- 实现类的热部署:可以定义类的实现机制,如果我们可以检查已经加载的class文件是否被修改,如果修改了,可以重新加载这个类。
findClass()的功能是找到class文件并把字节码加载到内存中。自定义的ClassLoader一般覆盖改方法,以便使用不同的加载路径,然后调用defineClass()解析字节码。
defineClass()方法用来将byte字节流解析成JVM能够识别的Class对象。有了这个方法意味着我们不仅仅可以通过class文件实例化对象,还可以通过其他方式实例化对象,如我们通过网络接收到一个类的字节码,拿这个字节码流直接创建类的Class对象形式实例化对象。
自定义的加载器可以覆盖方法loadClass()以便定义不同的加载机制。
如果自定义的加载器仅覆盖了findClass(),而未覆盖loadClass(即加载规则一样,但加载路径不同);则调用getClass().getClassLoader()返回的仍然是AppClassLoader!因为真正的load类,还是AppClassLoader.
加载自定义路径下的class文件
下面演示一个方法加载指定路径下(”D:/workspace_jee/JavaTest/src/”)的类文件。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
输出结果:classloader.SingleClass@22a7fdef
加载自定义格式的class文件
如果我们从网路上下载一个class文件的字节码,但是为了安全性在传输之前对这个字节码进行了简单的加密处理,然后再通过网络传输。当客户端接收到这个类的字节码后需要经过解密才能还原成原始的类格式,然后再通过ClassLoader的defineClass()方法创建这个类的实例,最后完成类的加载工作。
比如上面的代码中,在获取到字节码(byte[] classData = getData(name);)之后再通过一个类似以下的代码:
- 1
- 2
- 3
- 4
- 5
将字节码解码成所需要的字节码即可。
实现类的热部署
JVM默认不能热部署类,因为加载类时会去调用findLoadedClass(),如果类已被加载,就不会再次加载。
JVM判断类是否被加载有两个条件:完整类名是否一样,ClasssLoader是否是同一个
所以要实现热部署的话,只需要使用ClassLoader的不同实例来加载。
如果用同一个ClassLoader实例来加载同一个类,则会抛出LinkageError.
Jsp就是一个热部署的例子。
如下所示:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
这段代码的运行结果为:
- 1
- 2
- 3
- 4
- 5
- 6
比较两个类是否“相等”,只有在这两个类是由同一个类加载器加载的前提下才有意义,否则,即使这两个类来源于同一个Class文件,被同一个虚拟机加载,只要加载他们的类加载器不同,那这两个类就必定不相等。
- Java类加载器(二)——自定义类加载器
- Java类加载器(二)——自定义类加载器
- JAVA自定义类加载器
- Java自定义类加载器
- 【java】自定义类加载器
- java自定义类加载器
- Java自定义类加载器
- java自定义类加载器
- 自定义java类加载器
- Classloader 二 自定义类加载器
- 黑马程序员——【Java】【高新技术】自定义类加载器
- Java类加载器(自定义类加载器)
- Java 类加载器(三)-自定义加载器源代码
- Java类加载原理及自定义类加载器
- JAVA类加载机制以及如何自定义类加载器
- JAVA类加载机制以及如何自定义类加载器
- Java JVM:编译加载与自定义类加载器
- Java JVM:编译加载机制与自定义类加载器
- Java类加载器(一)——类加载器层次与模型
- Python学习笔记(2)-whil,for,for...in,循环嵌套
- 机房收费系统之上下机
- codeforces 374C Inna and Dima (dfs+记忆化)
- window环境下使用ndk编译出android studio/Eclipse能使用的ffmpeg动态库
- Java类加载器(二)——自定义类加载器
- 关于C语言字符串Dddi DdD的一些问题处理
- 解析C语言结构体对齐(内存对齐问题)
- Referer伪造,防盗链与反盗链相关
- Java NIO——6 基于非阻塞编程UDP NIO的例子
- 处理从数据库中返回的json格式日期
- 构造方法与析构方法、对象类型在内存中的分配
- 【nyoj 1261 不是匹配 】
- Python web多sitemap创建更新解决方案