使用javassist修改.class文件,并重新打包

Javassist是一款字节码编辑工具,可以直接编辑和生成Java生成的字节码,以达到对.class文件进行动态修改的效果。熟练使用这套工具,可以让Java编程更接近与动态语言编程。

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

Javassist下载地址 查看

1.准备jar包

用spring  boot 创建了一个项目seed

用到的主要的类

package com.example.seed.common;

public class Solution {
    public int xyz(int[] nums) {

        int i=0;
        for(int n :nums){
            i+=n;
        }
        return i;
    }

    public int xyz(int[] nums, int val) {
        int i=0;
        for(int n:nums){
            if(val!=n){
               i+=n;
            }
        }
        return i;
    }
}

mvn打包

2.修改编译后的class

导入下载的Javassist里的javassist.jar

import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;

public class Main {

    public static void main(String[] args) {
        try {
            ClassPool pool = ClassPool.getDefault();
            pool.insertClassPath("E:/java/project/mycrack/data/seed-1.0/BOOT-INF/classes") ;
            CtClass c2 = pool.get("com.example.seed.common.Solution");
            CtMethod[] ms = c2.getDeclaredMethods();
            for (CtMethod c : ms) {
                System.out.println(c.getName());
                CtClass[] ps = c.getParameterTypes();
                for (CtClass cx : ps) {
                    System.out.println("\t" + cx.getName());
                }
                if (c.getName().equals("xyz") && ps.length == 2
                        && ps[0].getName().equals("int[]")
                        && ps[1].getName().equals("int")) {
                    System.out.println("find it");
                    //c.insertBefore("{return 0;}");
                    c.setBody("{return 0;}");
                }
            }
            c2.writeFile();

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

运行后会在项目根目录下生成修改后的class文件

 修改.class文件,并重新打包 随笔

 

说明:

  由于Spring boot有自己的加载方式,因此现将jar包改为zip,再解压,直接设置com所在目录

 将刚生成的class替换原来的class文件,压缩为zip,修改后缀为.jar

完成

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄