修改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\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

 完成


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM