Java利用endorsed如何覆盖jdk提供的类详解

 更新时间:2017年09月05日 08:47:19   作者:jijs  
这篇文章主要给大家介绍了关于Java利用endorsed如何覆盖jdk提供的类的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。

前言

在之前我们分析 Tomcat catalina.bat 原理解析 时候,我们发现在启动tomcat的参数中存在 -Djava.endorsed.dirs 参数

如下图:


-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都改变了!!!

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • Spring的连接数据库以及JDBC模板(实例讲解)

    Spring的连接数据库以及JDBC模板(实例讲解)

    下面小编就为大家带来一篇Spring的连接数据库以及JDBC模板(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • Java硬币翻转倍数递增试算实例

    Java硬币翻转倍数递增试算实例

    这篇文章主要介绍了Java硬币翻转倍数递增试算实例,有需要的朋友可以参考一下
    2013-12-12
  • 详解Alibaba Java诊断工具Arthas查看Dubbo动态代理类

    详解Alibaba Java诊断工具Arthas查看Dubbo动态代理类

    这篇文章主要介绍了Alibaba Java诊断工具Arthas查看Dubbo动态代理类 ,它可以帮助我们查看JDK或者javassist生成的动态代理类,当然,它的功能远不止此,还可以在生产环境进行诊断,需要的朋友可以参考下
    2022-04-04
  • SpringBoot自动装配原理详细解析

    SpringBoot自动装配原理详细解析

    这篇文章主要介绍了SpringBoot自动装配原理详细解析,一个对象交给Spring来管理的三种方式 @Bean @Compoment @Import,
    @Bean主要在@Configuration中,通过方法进行注入相关的Bean,@Compoent与@Service归为一类,在类上加注入对应的类,需要的朋友可以参考下
    2024-01-01
  • 解决java中的父类私有成员变量的继承问题

    解决java中的父类私有成员变量的继承问题

    这篇文章主要介绍了解决java中的父类私有成员变量的继承问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • 详解Java字符型常量和字符串常量的区别

    详解Java字符型常量和字符串常量的区别

    Java 中的字符型常量和字符串常量是两种不同的数据类型,本文将给大家详细介绍一下Java字符型常量和字符串常量的区别,文中通过代码讲解的非常详细,需要的朋友可以参考下
    2023-10-10
  • java设计模式—静态代理模式(聚合与继承方式对比)

    java设计模式—静态代理模式(聚合与继承方式对比)

    下面小编就为大家带来一篇java设计模式—静态代理模式(聚合与继承方式对比)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • Springmvc工程跳转controller无效的解决

    Springmvc工程跳转controller无效的解决

    这篇文章主要介绍了Springmvc工程跳转controller无效的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Kotlin lateinit与by lazy案例详解

    Kotlin lateinit与by lazy案例详解

    这篇文章主要介绍了Kotlin lateinit与by lazy案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • SpringBoot整合XxlJob分布式任务调度平台

    SpringBoot整合XxlJob分布式任务调度平台

    xxl-job是一个开源的分布式定时任务框架,它可以与其他微服务组件一起构成微服务集群。它的调度中心(xxl-job)和执行器(自己的springboot项目中有@XxlJob("定时任务名称")的方法)是相互分离,分开部署的,两者通过HTTP协议进行通信
    2023-02-02

最新评论