修改jar中.class文件

背景:在开发中遇到三方jar包中出现了错误,需要修改相关代码进行更新

 1、查看.class文件

jar包就相当于一个压缩文件,windows中直接解压就行。

可以在 jd-gui 中查看要修改的.class文件,或者把.class文件拖进idea中查看。

2、修改.class文件

方法一:在解压的文件夹下,新建与class文件同名的java文件,把class中的代码复制到java中,并修改相关代码,最后在命令行中运行javac命令编译成.class文件与之前的进行替换。(如果依赖其他的class文件,就用javac -cp 命令)

方法二:如果要修改的.class文件中存在很多依赖的jar,使用javac命令就没办法实现(比如Android的文件)。

这时考虑使用 javassist ,直接在idea中导入官网下载的jar包就能使用,具体用法可以 参考官网 或者 别人的blog(刚开始可以写个demo运行一下,个人感觉语法和反射的用法很像)。

同样得到.class文件之后替换之前的文件。

在使用javassist时遇到的一些坑记录如下:

1. 如果使用setBody方法无效可以删除方法之后再把方法加进去

2. 删除方法是自上而下的删除,如果存在好多相同名字的函数(即重载),需要使用 getDeclaredMethods 获取重载方法的数组

public class GenerateClazzMethod {
    public static void main(String[] args) throws NotFoundException, CannotCompileException, IOException {

        ClassPool pool = ClassPool.getDefault();
        pool.insertClassPath("D:\\Project\\javaTest");
        CtClass ctClass = pool.get("com.huawei.hms.activity.BridgeActivity");

        CtMethod[] method = ctClass.getDeclaredMethods("a");
//        ctClass.removeMethod(method[1]);
        method[1].insertBefore("com.huawei.hms.support.log.a.d(\"chenbin\", \"method begin\");");
        method[1].insertAfter("com.huawei.hms.support.log.a.d(\"chenbin\", \"method end\");");

        /*CtMethod method1 = ctClass.getDeclaredMethod("onCreate");
        method1.insertBefore("this.requestWindowFeature(1);");*/

        ctClass.writeFile();

    }
}

3、重打jar包

进入之前解压的目录下,在命令行中运行

 jar cvf xxx.jar . // "."代表当前路径

参数f:指定打包后的包名。

参数c:指定是创建新的归档文件。

参数v:在标准输出中生成详细输出,该选项是可选的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值