JVM——自定义类加载器
来源:互联网 发布:假面骑士空我 知乎 编辑:程序博客网 时间:2024/06/07 00:15
0. 为什么需要自定义类加载器
网上的大部分自定义类加载器文章,几乎都是贴一段实现代码,然后分析一两句自定义ClassLoader的原理。但是我觉得首先得把为什么需要自定义加载器这个问题搞清楚,因为如果不明白它的作用的情况下,还要去学习它显然是很让人困惑的。
首先介绍自定义类的应用场景:
(1)加密:Java代码可以轻易的被反编译,如果你需要把自己的代码进行加密以防止反编译,可以先将编译后的代码用某种加密算法加密,类加密后就不能再用Java的ClassLoader去加载类了,这时就需要自定义ClassLoader在加载类的时候先解密类,然后再加载。
(2)从非标准的来源加载代码:如果你的字节码是放在数据库、甚至是在云端,就可以自定义类加载器,从指定的来源加载类。
(3)以上两种情况在实际中的综合运用:比如你的应用需要通过网络来传输 Java 类的字节码,为了安全性,这些字节码经过了加密处理。这个时候你就需要自定义类加载器来从某个网络地址上读取加密后的字节代码,接着进行解密和验证,最后定义出在Java虚拟机中运行的类。
1. 双亲委派模型
在实现自己的ClassLoader之前,我们先了解一下系统是如何加载类的,那么就不得不介绍双亲委派模型的实现过程。
双亲委派模型的工作过程如下:
(1)当前类加载器从自己已经加载的类中查询是否此类已经加载,如果已经加载则直接返回原来已经加载的类。
(2)如果没有找到,就去委托父类加载器去加载(如代码c = parent.loadClass(name, false)所示)。父类加载器也会采用同样的策略,查看自己已经加载过的类中是否包含这个类,有就返回,没有就委托父类的父类去加载,一直到启动类加载器。因为如果父加载器为空了,就代表使用启动类加载器作为父加载器去加载。
(3)如果启动类加载器加载失败(例如在$JAVA_HOME/jre/lib里未查找到该class),会使用拓展类加载器来尝试加载,继续失败则会使用AppClassLoader来加载,继续失败则会抛出一个异常ClassNotFoundException,然后再调用当前加载器的findClass()方法进行加载。
双亲委派模型的好处:
(1)主要是为了安全性,避免用户自己编写的类动态替换 Java的一些核心类,比如 String。
(2)同时也避免了类的重复加载,因为 JVM中区分不同类,不仅仅是根据类名,相同的 class文件被不同的 ClassLoader加载就是不同的两个类。
2. 自定义类加载器
(1)从上面源码看出,调用loadClass时会先根据委派模型在父加载器中加载,如果加载失败,则会调用当前加载器的findClass来完成加载。
(2)因此我们自定义的类加载器只需要继承ClassLoader,并覆盖findClass方法,下面是一个实际例子,在该例中我们用自定义的类加载器去加载我们事先准备好的class文件。
2.1 自定义一个People.java类做例子
2.2 自定义类加载器
自定义一个类加载器,需要继承ClassLoader类,并实现findClass方法。其中defineClass方法可以把二进制流字节组成的文件转换为一个java.lang.Class(只要二进制字节流的内容符合Class文件规范)。
2.3 在主函数里使用
2.4 运行结果
至此关于自定义ClassLoader的内容总结完毕。
转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/52315125
- JVM——自定义类加载器
- JVM——自定义类加载器
- 【JVM】自定义类加载器
- 深入JVM之自定义类加载器
- jvm自定义类的加载器
- java jvm-自定义类加载器
- jvm(四)自定义类加载器
- JVM类加载器原理与自定义类加载器
- JVM第四天自定义类加载器及加载原理
- Java JVM:编译加载与自定义类加载器
- JVM:编译加载与自定义类加载器
- Java JVM:编译加载机制与自定义类加载器
- Java JVM:编译加载与自定义类加载器
- JVM:编译加载机制与自定义类加载器
- JVM(3)——JVM类加载器
- JVM内核—JVM类加载机制
- 【010】【JVM——类加载器】
- JVM——类加载器
- php中常用的字符串截取函数mb_substr实例解释
- Hello World !
- UVA 423
- mysql基本查询
- ESP8266调试-P2P(AP模块与STA模块通信)
- JVM——自定义类加载器
- Eclipse新建maven工程出错:Could not resolve archetype org.apache.maven.archetypes:maven-archetype-quickstar
- 内存屏障(还得补)
- dwr+maven实现java和js方法互相调用,实现推送, 完整切超简单例子
- 两种文件修改的方式
- Android自定义View之属性
- Oracle12C--系统触发器(58)
- java 基础三
- 2017年9月24笔记