修改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把包名当成文件夹处理."包名+类名"相当于"文件夹目录+类名"来寻找类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值