Java 使用 endorsed 覆盖jdk提供的类
2017-08-27 14:31
579 查看
在分析 Tomcat catalina.bat 原理解析时候,我们发现在启动tomcat的参数中存在 -Djava.endorsed.dirs 参数
如下图:
关于 endorsed :可以的简单理解为 -Djava.endorsed.dirs 指定的目录面放置的jar文件,将有覆盖系统API的功能。但是能够覆盖的类是有限制的,其中不包括java.lang包中的类(出于安全的考虑)。
然后通过打包jar文件,放到一个目录。
我这里是放到 “D:\endorsed” 该目录下
运行的时候加上 -Djava.endorsed.dirs=D:\endorsed 参数。如下图:
从结果中我们发现,打印的信息不是我们程序中输出的,而是ArrayList.get()方法中打印出来的。
$JAVA_HOME/jre/lib/endorsed
这样基于这个JDK的所有的ArrayList都改变了!!!
本人简书blog地址:http://www.jianshu.com/u/1f0067e24ff8
点击这里快速进入简书
GIT地址:http://git.oschina.net/brucekankan/
点击这里快速进入GIT
如下图:
-Djava.endorsed.dirs
java提供了endorsed技术:关于 endorsed :可以的简单理解为 -Djava.endorsed.dirs 指定的目录面放置的jar文件,将有覆盖系统API的功能。但是能够覆盖的类是有限制的,其中不包括java.lang包中的类(出于安全的考虑)。
为什么必须使用 endorsed 进行替换 jdk 中的类呢?
因为java是采用双亲委派机制进行加载class类的。而jdk提供的类只能由类加载器Bootstrap进行加载。如果你想要在应用程序中替换掉jdk中的某个类是无法做到的,所以java提供了endorsed来达到你想要替换到系统中的类。示例
修改java.util.ArrayList类中的 get(int index) 方法,在该方法中添加输出获取的值信息,如果是字符串直接输出,如果不是则输出类信息,及加载该元素类的classloader。代码如下:然后通过打包jar文件,放到一个目录。
我这里是放到 “D:\endorsed” 该目录下
测试类
public class Bootstrap { public static void main(String[] args) { ArrayList<String> list = new ArrayList<String>(10); for(int i=0;i<10; i++){ list.add("test"+i); list.get(i); } } }
运行的时候加上 -Djava.endorsed.dirs=D:\endorsed 参数。如下图:
运行结果
从结果中我们发现,打印的信息不是我们程序中输出的,而是ArrayList.get()方法中打印出来的。
endorsed 另一种修改方式
根据官方文档描述:如果不想添加-D参数,如果我们希望基于这个JDK下的都统一改变,那么我们可以将我们修改的jar放到:$JAVA_HOME/jre/lib/endorsed
这样基于这个JDK的所有的ArrayList都改变了!!!
本人简书blog地址:http://www.jianshu.com/u/1f0067e24ff8
点击这里快速进入简书
GIT地址:http://git.oschina.net/brucekankan/
点击这里快速进入GIT
相关文章推荐
- Java利用endorsed如何覆盖jdk提供的类详解
- Java_类和对象(完美总结)_转载_覆盖和隐藏的区别,覆盖就不能使用了,而隐藏提供全局方法名或者全局变量名还可以使用
- 08-01 java 帮助文档的制作和使用,使用jdk提供的帮助文档
- 在 java 的 bin 目录下,jdk 提供了很多使用的工具,下面学习一些监控和故障处理的工具。
- JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用简介
- java初学者实践教程2-jdk的使用
- 使用Java JDK中Java.net包控制UDP协议
- jdk1.4 构建 java多线程,并发设计框架 使用列子(四)
- 使用Java提供的类生成XML例子
- JDK1.4的java.util.Logging包的使用说明与示例
- [小技巧]使用Eclipse做Java开发时,JDK1.6居然也不认识enum和泛型的解决办法
- jdk1.4 构建 java多线程,并发设计框架 使用列子(五)
- 好用的Java反编译工具,支持JDK1.4,5.0,6.0,还提供了eclipse插件
- JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用简介
- [转]JDK早期版本中使用Java 5语言特性
- java中使用JDK的native2ascii进行字符转换 国际化中的汉字转换
- 在 JDK 早期版本中使用 Java 5 的语言
- 使用Java JDK中Java.net包控制UDP协议
- Java 理论与实践: 在 JDK 早期版本中使用 Java 5 的语言特性
- 获取Ant使用的jdk,java版本