修改Jar內容

例子

最近線上報了一個java.lang.UnsatisfiedLinkError的錯誤,發現環信內部沒有將某個loadLibrary方法try catch(error),可是其內部的_loadLibrary方法是try catch(error)的,因此準備作如下修改: 爲hyphenatechat_3.4.2.jar中的EMClient.class文件中的loadLibrary方法作如下替換:html

private static void loadLibrary() {
    if (!libraryLoaded) {
        _loadLibrary("sqlite");
        _loadLibrary("hyphenate_av");
        _loadLibrary("hyphenate_av_recorder");
        System.loadLibrary("hyphenate");
        libraryLoaded = true;
    }

}
複製代碼

替換爲java

private static void loadLibrary() {
    if (!libraryLoaded) {
        _loadLibrary("sqlite");
        _loadLibrary("hyphenate_av");
        _loadLibrary("hyphenate_av_recorder");
        _loadLibrary("hyphenate");
        libraryLoaded = true;
    }

}
複製代碼

環境

Windowsandroid

須要下載內容

使用步驟

  1. 依賴javassist Jar;
  2. 使用jar xvf oldJar.jar命令解壓縮oldJar到當前目錄下;
  3. 編寫代碼;
  4. 使用jd-gui驗證newClass文件是否正確;
  5. 使用jar cvfm META-INF\MANIFEST.MF newJar.jar *命令將當前目錄下的全部文件壓縮成newJar,而且使用環信生成的MANIFEST.MF;
  6. 用newJar替換工程中的Jar。

3.代碼

package com.fqxyi.androidutils.test;

import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;

/** * Java方法測試類 */
public class JavaTest {

    public static void main(String[] args) {
        try {
            modifyClass();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static void modifyClass() throws Exception {
        ClassPool pool = ClassPool.getDefault();
        //設置目標類的路徑
        pool.insertClassPath("C:\\Users\\Administrator\\Desktop\\hyphenatechat_3.4.2\\") ;
        //得到要修改的類
        CtClass cc =pool.get("com.hyphenate.chat.EMClient");//就是對EMClient.class的映射
        //獲得方法
        CtMethod m = cc.getDeclaredMethod("loadLibrary");
        //能夠在函數的開頭插入新的代碼
        //m.insertBefore("{return true;}") ;
        //也能夠自定義loadLibrary方法的內容
        m.setBody("{if (!libraryLoaded)\n" +
                " {\n" +
                " _loadLibrary(\"sqlite\");\n" +
                " _loadLibrary(\"hyphenate_av\");\n" +
                " _loadLibrary(\"hyphenate_av_recorder\");\n" +
                " _loadLibrary(\"hyphenate\");\n" +
                " libraryLoaded = true;\n" +
                " }}");
        //保存到文件裏,會在項目根目錄下生成一個EMClient.class,並無自動替換EMClient.class,須要本身手動替換進去
        cc.writeFile() ;
    }

}
複製代碼

參考文章

更好的方式

AOP:之後總結git

相關文章
相關標籤/搜索