以下代码需要asm-5.0.2.jar和asm-commons-5.0.2.jar两个包。
package com.shihuan.field;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.prefs.NodeChangeEvent;
import java.util.spi.LocaleNameProvider;
import java.util.spi.TimeZoneNameProvider;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.logging.ConsoleHandler;
import java.util.logging.Formatter;
public class AccountField {
int mynum;
static java.util.Date mydate;
Long mu370;
static Float mfhj;
byte[] mybb;
java.sql.Timestamp[][] parameterTt;
static final int ABCDEF = 0;
boolean bingop;
java.io.InputStream[] islk;
private int myinnn;
protected boolean isServer;
public static final String BUIO = "1999999999999999999999999999999999999";
String sql = "select * from tables";
public AccountField() {
}
public AccountField(boolean bingop) {
this.bingop = bingop;
}
public void operation() {
System.out.println("shihuan operation...");
}
int executeInternal() {
System.out.println("shihuan executeInternal...");
if (true) {
return 2;
}
return 1;
}
}
package com.shihuan.field;
public class TestAccountField {
public static void main(String[] args) {
AccountField t = new AccountField();
t.operation();
t.executeInternal();
}
}
运行AsmDeleteField.java会删除掉AccountField.java文件中的mynum属性:
package com.shihuan.field;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.FieldVisitor;
import org.objectweb.asm.Opcodes;
public class AsmDeleteField {
public static void main(String[] args) throws IOException {
ClassReader cr = new ClassReader("com.shihuan.field.AccountField");
ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_MAXS);
ClassVisitor cv = new ClassVisitor(Opcodes.ASM5, cw) {
public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) {
if("mynum".equals(name)) { //值域变量名称为mynum的时候
return null; //为null表示去掉
}
return super.visitField(access, name, desc, signature, value); //不为null,保留
}
};
cr.accept(cv, ClassReader.SKIP_DEBUG);
byte[] code = cw.toByteArray();
OutputStream fos = new FileOutputStream("D:/myworkspace/JavaAsm/bin/com/shihuan/field/AccountField.class");
fos.write(code);
fos.close();
}
}
运行AsmDeleteField.java会在AccountField.java文件中添加一个公有int类型的mynum属性:
package com.shihuan.field;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.Type;
public class AsmAddField {
public static void main(String[] args) throws IOException {
ClassReader cr = new ClassReader("com.shihuan.field.AccountField");
ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_MAXS);
ClassVisitor cv = new ClassVisitor(Opcodes.ASM5, cw) {
public void visitEnd() {
visitField(Opcodes.ACC_PUBLIC, "mynum", Type.getDescriptor(int.class), null, null); //添加一个名字为mynum的int类型的公有属性
super.visitEnd();
}
};
cr.accept(cv, ClassReader.SKIP_DEBUG);
byte[] code = cw.toByteArray();
OutputStream fos = new FileOutputStream("D:/myworkspace/JavaAsm/bin/com/shihuan/field/AccountField.class");
fos.write(code);
fos.close();
}
}