修改jar的.class文件,并重新打包

原文:https://www.cnblogs.com/baby123/p/10871154.html

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

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

下面实现如何修改jar包里的方法

Javassist下载地址 查看

1.准备jar包

my/Solution.java

View Code

my/Encrypt.java

View Code

新建resource

编译 javac  -sourcepath my my ools*.java -d resource

META-INF/MANIFEST.MF

Manifest-Version: 1.0
Created-By: 1.8.0_151 (Oracle Corporation)

进入resource打包  jar -cvfm mytools.jar META-INFMANIFEST.MF *

使用

复制代码
import my.tools.Solution;

public class Main {

    public static void main(String[] args) {

        System.out.println(new Solution().strStr("aacabseew", "ab"));
    }
}
复制代码

输出:3

实现的查找第二个字符串出现的位置

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.getDefault().insertClassPath("data/mytools.jar");
            CtClass c2 = ClassPool.getDefault().getCtClass("my.tools.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("	" + cx.getName());
                }
                if (c.getName().equals("strStr") && ps.length == 2
                        && ps[0].getName().equals("java.lang.String")
                        && ps[1].getName().equals("java.lang.String")) {
                    c.setBody("{System.out.println($1);return 0;}");
                }
            }
            c2.writeFile();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
复制代码

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

3.生成新的jar

将以前的jar包修改mytools.zip

解压mytools.zip为mytools1,将刚才生成的my/tools/Solution.class替换掉mytools1里的Solution.class,

压缩mytools1为mytools1.zip

 修改文件名为mytools1.jar

导入新的jar包

测试

复制代码
import my.tools.Solution;

public class Main {

    public static void main(String[] args) {

        System.out.println(new Solution().strStr("aacabseew","ab"));

    }
}
复制代码

输出

aacabseew
0

 完成

原文地址:https://www.cnblogs.com/shihaiming/p/13024607.html