原文:https://www.cnblogs.com/baby123/p/10871154.html
使用javassist修改.class文件,並重新打包
Javassist是一款字節碼編輯工具,可以直接編輯和生成Java生成的字節碼,以達到對.class文件進行動態修改的效果。熟練使用這套工具,可以讓Java編程更接近與動態語言編程。
下面實現如何修改jar包里的方法
Javassist下載地址 查看
1.准備jar包
my/Solution.java

my/Encrypt.java

新建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
完成