修改jar包内的class

作者 时间 qq
刘权 20180613 653945222

原因

由于要修改现场的一个jar包,但是现场没有项目的编译环境

方案一:通过反编译工具获取java文件,再通过java将class打包到jar包中

  1. 使用反编译工具JD-GUI打开jar包
  2. 找到要修改的类
  3. FIle->save(保存class的java文件)
  4. 使用文编编辑器修改java文件,并保存
  5. 将java文件放入对应的包路径下
  6. 执行javac -cp xx.jar com\epri\service\HelloService.java,生成对应的class文件
  7. 将class打包到jar包
    方案一:使用命令: jar -uvf xx.jar com\epri\service\HelloService.class
    方案二:使用解压工具打开jar包,然后将class放入对应位置替换原class即可。

方案二:使用arthas反编译出源代码,再使用arthas编译成class文件

  • 前提条件:这种方式需要程序在运行中才可以。
  1. 下载arthas压缩包
  2. 解压压缩包
  3. 进入arthas/bin目录
  4. 启动arthas
  5. 输入应用的序号,回车
  6. 反编译:jad --source-only com.epri.service.HelloService > /tmp/HelloService.java
  7. 修改源代码:/tmp/HelloService.java
  8. 获取com.epri.service.HelloService类的classloader的hashcode(下一步要用):sc -d com.epri.service.HelloService,这里获取到的classloader的hashcode为3d4eac69
$ sc -d com.epri.service.HelloService
class-info        com.epri.service.HelloService
code-source       /private/tmp/hello.jar
name              com.epri.service.HelloService
isInterface       false
isAnnotation      false
isEnum            false
isAnonymousClass  false
isArray           false
isLocalClass      false
isMemberClass     false
isPrimitive       false
isSynthetic       false
simple-name       MathGame
modifier          public
annotation
interfaces
super-class       +-java.lang.Object
class-loader      +-sun.misc.Launcher$AppClassLoader@3d4eac69
                    +-sun.misc.Launcher$ExtClassLoader@66350f69
classLoaderHash   3d4eac69

Affect(row-cnt:1) cost in 875 ms.
  1. 编译java类:mc -c 3d4eac69 /tmp/HelloService.java -d /tmp,编译后,在/tmp就会有HelloService.class文件
  2. 将class打包到jar包
    方案一:使用命令: jar -uvf xx.jar com\epri\service\HelloService.class(ps:需要先创建目录com\epri\service,然后将class文件放到service目录中,该命令执行需要在com的上一层目录执行)
    方案二:使用解压工具打开jar包,然后将class放入对应位置替换原class即可。

相关问题:

  1. 如果依赖的包为多个。
  • 多个依赖的JAR包,LINUX下用“:”分割,WINDOW下用“;”分割
  • 多个源文件用空格分隔,也可以使用诸如“*”之类的通配符

例:

javac -cp D:\Desktop\test.jar;D:\software\android\sdk\platforms\android-27\android.jar test1.java test2.java
或
javac -cp D:\Desktop\test.jar;D:\software\android\sdk\platforms\android-27\android.jar *.java
  1. javac编译错误: 编码UTF8/GBK的不可映射字符
  • 确定java文件的编码
  • 在编译时指定编码:javac编译错误: 编码UTF8/GBK的不可映射字符
    例:
javac  -encoding utf-8  -cp  xx.jar com\epri\service\HelloService.java

参考文献:

https://blog.csdn.net/Leytton/article/details/52740171
https://blog.csdn.net/chy555chy/article/details/78460837
https://blog.csdn.net/foxfire882/article/details/70513642

你可能感兴趣的:(修改jar包内的class)