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

总结

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

(0)

相关推荐

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

    前言 在之前我们分析 Tomcat catalina.bat 原理解析 时候,我们发现在启动tomcat的参数中存在 -Djava.endorsed.dirs 参数 如下图: -Djava.endorsed.dirs Java提供了endorsed技术: 关于 endorsed :可以的简单理解为 -Djava.endorsed.dirs 指定的目录面放置的jar文件,将有覆盖系统API的功能.但是能够覆盖的类是有限制的,其中不包括java.lang包中的类(出于安全的考虑). 为什么必须使用

  • Java二维数组与动态数组ArrayList类详解

    Java二维数组 Java 语言中提供的数组是用来存储固定大小的同类型元素. 1.二维数组初始化和声明 数组变量的声明,和创建数组可以用一条语句完成,如下所示: int a[][] = new int[2][3]; int[][] arr = {{1,2,3},{4,5,6},{7,8,9}}; 2.二维数组遍历 //遍历二维数组 public class Traverse_a_two_dimensional_array { public static void main(String[] ar

  • Java 高并发六:JDK并发包2详解

    1. 线程池的基本使用 1.1.为什么需要线程池 平时的业务中,如果要使用多线程,那么我们会在业务开始前创建线程,业务结束后,销毁线程.但是对于业务来说,线程的创建和销毁是与业务本身无关的,只关心线程所执行的任务.因此希望把尽可能多的cpu用在执行任务上面,而不是用在与业务无关的线程创建和销毁上面.而线程池则解决了这个问题,线程池的作用就是将线程进行复用. 1.2.JDK为我们提供了哪些支持 JDK中的相关类图如上图所示. 其中要提到的几个特别的类. Callable类和Runable类相似,但

  • Java利用happen-before规则如何实现共享变量的同步操作详解

    前言 熟悉 Java 并发编程的都知道,JMM(Java 内存模型) 中的 happen-before(简称 hb)规则,该规则定义了 Java 多线程操作的有序性和可见性,防止了编译器重排序对程序结果的影响. Java语言中有一个"先行发生"(happen-before)的规则,它是Java内存模型中定义的两项操作之间的偏序关系,如果操作A先行发生于操作B,其意思就是说,在发生操作B之前,操作A产生的影响都能被操作B观察到,"影响"包括修改了内存中共享变量的值.发

  • Java利用Request请求获取IP地址的方法详解

    前言 最近在项目中遇到一个需求,是需要将不同省份的用户,展示不同内容,通过查找相关的资料,发现可以通过Request请求获取IP地址,下面我们先来贴代码, 如果你要在生产环境使用就直接拿去用吧,我这边已经上线了. 示例代码 public class IpAdrressUtil { /** * 获取Ip地址 * @param request * @return */ private static String getIpAdrress(HttpServletRequest request) { S

  • java实例方法被覆盖,静态方法被隐藏Explain(详解)

    被覆盖比较好理解,类似于多态的实现,访问时通过类方法表来访问,你实际是什么类型,访问的方法就是那个类型的方法而不会是你的父类的方法. 被隐藏是指静态方法的访问是根据当前对象的表面类型来决定的,比如 Super s = new Sub(); s.greeting()访问的是Super的静态方法,如果是Sub s = new Sub();则访问的是Sub的静态方法. 换句话说,这个实现不了多态. 此外,静态方法和实例方法不能互相覆盖(会报错),因为他们的在字节码中的的绑定位置不同. 以上这篇java

  • Java编程实现对象克隆(复制)代码详解

    克隆,想必大家都有耳闻,世界上第一只克隆羊多莉就是利用细胞核移植技术将哺乳动物的成年体细胞培育出新个体,甚为神奇.其实在Java中也存在克隆的概念,即实现对象的复制. 本文将尝试介绍一些关于Java中的克隆和一些深入的问题,希望可以帮助大家更好地了解克隆. 假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(boolean,char,byte,short,float,double.long)同样适

  • Java ThreadLocal原理解析以及应用场景分析案例详解

    目录 ThreadLocal的定义 ThreadLocal的应用场景 ThreadLocal的demo TheadLocal的源码解析 ThreadLocal的set方法 ThreadLocal的get方法 ThreadLocalMap的结构 ThreadLocalMap的set方法 ThreadLocalMap的getEntry方法 ThreadLocal的内存泄露 如何避免内存泄露呢 应用实例 实际应用二 总结 ThreadLocal的定义 JDK对ThreadLocal的定义如下: The

  • Java Big Number操作BigInteger及BigDecimal类详解

    目录 BigInteger类 构造函数 类方法 BigDecimal类 BigInteger类 java.math.BigInteger 类的使用场景是大整数操作.它提供类似所有Java的基本整数运算符和java.lang.Math中的所有相关的方法的操作,如+.-.*./.%.&.|.mod.>>.<<,以及min().max()等等. 只不过它操作的整数都是极其大的,为科学计算提供了很大的便利.比如下面的代码就是计算20000000000000000000 * 3000

  • Java System类详解_动力节点Java学院整理

    System类是jdk提供的一个工具类,有final修饰,不可继承,由名字可以看出来,其中的操作多数和系统相关.其功能主要如下: • 标准输入输出,如out.in.err • 外部定义的属性和环境变量的访问,如getenv()/setenv()和getProperties()/setProperties() • 加载文件和类库的方法,如load()和loadLibrary(). • 一个快速拷贝数组的方法:arraycopy() • 一些jvm操作,如gc().runFinalization()

随机推荐