jclasslib 修改常量,修改import等比较容易。
但是修改方法,我自己没有找到有好用的api,可能是自己没有找到

使用javaasist 或者 asm 都可以修改方法。
相对比较简单。

jclasslib 简单的例子
public static void main(String[] args) throws Exception {

String root = System.getProperty("user.dir");
File sourceFile = new File(root,"WelcomeBean.class");

FileInputStream fis = new FileInputStream(sourceFile);

DataInput di = new DataInputStream(fis);
ClassFile cf = new ClassFile();
cf.read(di);
CPInfo[] infos = cf.getConstantPool();
FieldInfo[] fArr = cf.getFields();
MethodInfo[] mArr = cf.getMethods();
AttributeInfo[] aArr = cf.getAttributes();
String superClassName = cf.getSuperClassName();
String myClassName = cf.getThisClassName();

System.out.println("superClassName:" + superClassName);
System.out.println("myClassName:" + myClassName);
System.out.println("ConstantPool size:" + infos.length);
System.out.println("FieldInfo size:" + fArr.length);
System.out.println("AttributeInfo size:" + aArr.length);
System.out.println("MethodInfo size:" + mArr.length);


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].getTagVerbose());

if(i == 59){
ConstantUtf8Info info = (ConstantUtf8Info)infos[i];
info.setString("444444444");

}

}
}
cf.setConstantPool(infos);

count = mArr.length;
for(int i=0;i<count;i++){
MethodInfo info = mArr[i];
String name = info.getName();
if(name.equals("isSuperMan")){
String msg = "return false;";

}

}

fis.close();
ClassFileWriter.writeToFile(sourceFile, cf);
}