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(); } }