[JDK] 底层大法之替换JAR包中的class文件 [转发]

发布时间 2023-12-28 15:59:24作者: 千千寰宇

0 序

  • 背景

近期跟踪一个第三方组件skywalking针对spring cloud gatewaytraceId丢失问题,需要对 skywalking 内部组件类进行跟踪,需要在其组件源码内部添加一些观察代码,做以增强

  • Q1: 我没有 thrid-party.jar 的源码————故直接在源码上修改,然后打包(此法行不通)
  • Q2: 反编译出的源码,依赖了第三方社区(skywalking)内部的jar或者文件,解决不了依赖问题就无法打包(为了解决问题1只好对thrid-party.jar逆向工程,比如JD-GUI
    以上问题阻挠重新打JAR包。
  • 本方法的效果

本文章的方法,是Java语言的底层大法。在很多极端情况下,此法能解决相当重要的棘手问题。

  • 本文根据参考文献进行操作,实现了此目的。

  • 如下是操作过程(转载自参考文献

1 操作过程

Step1 将jar包和将要替换的class文件放到同一目录下

Step2 查找jar包中xxxdemo.class文件所在的具体路径

  • 命令如下:
jar -tvf xxxdemo.jar | grep xxxdemo.class

xxxdemo根据自己的jar包和类名替换

  • 复制路径备用

Step3 将xxxdemo.jar中指定的xxxdemo.class解压出来

jar -xvf cas_client_all.jar  com/baosight/buapx/security/filter/BuapxSecurityFilter.class

解压后如下:

Step4 将增强后的xxxdemo.class类 到com包下替换掉原来的类

Step5 将替换后的xxxdemo.class打进xxxdemo.jar中

命令:

jar -uvf cas_client_all.jar com/baosight/buapx/security/filter/BuapxSecurityFilter.class

  • 替换后的效果:

使用JD-GUI 反编译工具 打开JAR包

X 参考文献