1. 程式人生 > >修改jar包

修改jar包

1.如何用cmd命令到達指定資料夾
https://jingyan.baidu.com/article/60ccbceb60202c64cab1972c.html
2.java 檢視class檔案位元組碼
https://blog.csdn.net/qq_22494029/article/details/79385090
3.jclasslib修改class檔案(位元組碼檔案)----java檔案仍不變,程式編譯的是class檔案,所以結果會改變
https://blog.csdn.net/qq_25900743/article/details/79379596
4.直接修改別人jar包裡面的class檔案 工具:jclasslib

https://blog.csdn.net/hexin373/article/details/6669813
5.jclasslib工具下載:
https://blog.csdn.net/wuhenzhangxing/article/details/73294509
6.jclasslib相關外掛下載
https://plugins.jetbrains.com/plugin/9248-jclasslib-bytecode-viewer

第三點的補充:
安裝好jclasslib Bytecode viewer,之後在C:\Users\Administrator.AndroidStudio3.1\config\plugins\jclasslib\lib路徑下將jclasslib-library.jar包複製到app下的libs資料夾下。

import org.gjt.jclasslib.io.ClassFileWriter;
import org.gjt.jclasslib.structures.ClassFile;
import org.gjt.jclasslib.structures.Constant;
import org.gjt.jclasslib.structures.constants.ConstantStringInfo;
import org.gjt.jclasslib.structures.constants.ConstantUtf8Info;

import java.io.DataInput;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;


public class TestModify {
    public static void main(String[] args) throws Exception {
        String filePath = "E:\\KangYingPDA\\TestClass\\HelloWorld.class";//新建的需要進行操作的資料夾
        FileInputStream fis = new FileInputStream(filePath);

        DataInput di = new DataInputStream(fis);
        ClassFile cf = new ClassFile();
        cf.read(di);
        Constant[] infos = cf.getConstantPool();

        int count = infos.length;
        for(int i = 0; i < count; i++) {
            if(infos[i] != null) {
                System.out.print(i);
                System.out.print(" = ");
                System.out.print(infos[i].getVerbose());
                System.out.print(" = ");
//				System.out.println(infos[i].getVerbose() != "");
                System.out.println(infos[i].getVerbose() != "" ? infos[i].getConstantType() : "");
                if(i == 03) {
                //解決cast錯誤
                    ConstantStringInfo sInfo = (ConstantStringInfo) infos[i];
                    int strIndex = sInfo.getStringIndex();
                    ConstantUtf8Info uInfo = (ConstantUtf8Info)infos[strIndex];;
                    uInfo.setString("要修改的變數字串");
                    infos[i]=sInfo;
                }
            }
        }
        cf.setConstantPool(infos);
        fis.close();
        File f = new File(filePath);
        ClassFileWriter.writeToFile(f, cf);


    }

}

注意:如果直接在AS的Terminal視窗操作java命令,會報錯:java執行顯示“找不到或無法載入主類”!
解決方法:
將java檔案及class檔案放在新建的資料夾下,並把java檔案的package刪去!再用javac命令生成class檔案,java命令編譯class檔案
原理說明:
java程式執行class檔案,對於有包名的類,java把包名當成資料夾處理."包名+類名"相當於"資料夾目錄+類名"來尋找類。