修改Jar內(nèi)容

例子

最近線上報了一個java.lang.UnsatisfiedLinkError的錯誤,發(fā)現(xiàn)環(huán)信內(nèi)部沒有將某個loadLibrary方法try catch(error),但是其內(nèi)部的_loadLibrary方法是try catch(error)的,所以準(zhǔn)備做以下修改:
hyphenatechat_3.4.2.jar中的EMClient.class文件中的loadLibrary方法做以下替換:

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

}

替換為

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

}

環(huán)境

Windows

需要下載內(nèi)容

使用步驟

  1. 依賴javassist Jar;
  2. 使用jar xvf oldJar.jar命令解壓縮oldJar到當(dāng)前目錄下;
  3. 編寫代碼;
  4. 使用jd-gui驗證newClass文件是否正確;
  5. 使用jar cvfm META-INF\MANIFEST.MF newJar.jar *命令將當(dāng)前目錄下的所有文件壓縮成newJar,并且使用環(huán)信生成的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();
        //設(shè)置目標(biāo)類的路徑
        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");
        //可以在函數(shù)的開頭插入新的代碼
        //m.insertBefore("{return true;}") ;
        //也可以自定義loadLibrary方法的內(nèi)容
        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:以后總結(jié)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,654評論 19 139
  • 對于agent,是在vm啟動,執(zhí)行方法前,將字節(jié)碼修改的服務(wù)代理。 對于javassist,是修改字節(jié)碼具體實現(xiàn)。...
    城市里永遠的學(xué)習(xí)者閱讀 5,283評論 2 55
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,209評論 25 708
  • 大概,農(nóng)村的孩子,就酷愛村莊,反正我是。田野,荒草,鄉(xiāng)間小道以及小道兩邊的樹,田埂和溝壑。還有村里面的人們...
    龍青閱讀 461評論 1 5
  • 當(dāng)你隨波逐流,無論現(xiàn)在多厲害,都會有一天,累到沙灘,看不見自己要去的地方!當(dāng)你爭名奪利,無論你多本事,都會有一天,...
    hff韓范范閱讀 824評論 0 1

友情鏈接更多精彩內(nèi)容