修改jar的.class文件,并重新打包
原文:https://www.cnblogs.com/baby123/p/10871154.html
使用javassist修改.class文件,并重新打包
Javassist是一款字节码编辑工具,可以直接编辑和生成Java生成的字节码,以达到对.class文件进行动态修改的效果。熟练使用这套工具,可以让Java编程更接近与动态语言编程。
下面实现如何修改jar包里的方法
Javassist下载地址 查看
1.准备jar包
my/Solution.java
View Codemy/Encrypt.java
View Code新建resource
编译 javac -sourcepath my my\tools\*.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-INF\MANIFEST.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("\t" + 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
完成
看完打开支付宝扫一扫领个红包吧!


浙公网安备 33010602011771号