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