廣告做圖網(wǎng)站seo包年優(yōu)化
前言
Javassist 是一個用于處理 Java 字節(jié)碼的類庫,可以用以修改 class 文件或 jar 包里的 class 文件。
簡單來說我們用Java編寫的代碼是放在 java 格式的代碼文件里,在編譯的時候會編譯為 class 格式的字節(jié)碼文件,然后一般所有 class 文件會打成一個 jar 包對外提供服務(wù),
如果我們沒有源碼但是想修改 class 文件或 jar 包里的文件是很不方便的,而 Javassist 類庫就可以很方便的修改 class 和 jar 包。
Javassist 官網(wǎng)
Javassist Github地址
一、Maven依賴
<dependency><groupId>org.javassist</groupId><artifactId>javassist</artifactId><version>3.28.0-GA</version></dependency>
二、假設(shè)jar包中的 Student.class 類如下
假設(shè) tempTest-1.0-SNAPSHOT.jar 包里有 Student.class 如下:
package com.haitang.test.service;public class Student {public Student() {}public String name() {return "張三";}public boolean isStudent(int id, String name) {return id > 0 && id < 10 && name != null;}public void printName(int id, String name, int age) {System.out.println("學(xué)生姓名是:" + name);}
}
三、修改class文件
修改上面的 Student.class 里的 isStudent 方法 使其方法里返回 true
import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.NotFoundException;import java.io.IOException;public class MainServer {public static void main(String[] args) throws NotFoundException, CannotCompileException, IOException {//獲取 jar 包里的要修改的 class 文件,這里獲取 com.haitang.test.service 下的 Student.classClassPool pool = ClassPool.getDefault();pool.insertClassPath("C:\\myCode\\mavenTest\\lib\\tempTest-1.0-SNAPSHOT.jar");CtClass cc = pool.get("com.haitang.test.service.Student");//獲取該類里的所有方法CtMethod[] methodA = cc.getDeclaredMethods();//遍歷所有方法for (CtMethod ctMethod : methodA) {//獲取方法的參數(shù)信息CtClass[] ps = ctMethod.getParameterTypes();//如果該方法有兩個參數(shù),第一個是int 類型,第二個是String類型,并且方法名是 isStudent ,那么就將方法體修改為 return true;if (ps.length == 2 && "int".equals(ps[0].getName()) && "java.lang.String".equals(ps[1].getName()) && "isStudent".equals(ctMethod.getName())) {ctMethod.setBody("{return true;}");}}//將修改后的 clsss 文件保存到下面的路徑cc.writeFile("C:\\myCode\\mavenTest\\lib\\");}
}
將修改后的 clsss
文件進(jìn)行復(fù)制,使用 Bandzip 這樣的解壓縮軟件對 tempTest-1.0-SNAPSHOT.jar 進(jìn)行壓縮文件預(yù)覽,找到 Student.class
所在的位置,把修改后的 Student.class 粘貼覆蓋原來的 Student.class
。
這樣 tempTest-1.0-SNAPSHOT.jar 包里 Student 類的 isStudent 方法就被修改為用于返回 true 了。
其他操作可參考:
Java字節(jié)碼操作神器:Javassist入門指南
javassist使用指南
Javassist官方文檔翻譯