1. 程序实例
package asm.demo2.modify.access;
import org.apache.commons.lang3.StringUtils;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.FieldVisitor;
import static org.objectweb.asm.Opcodes.ACC_PUBLIC;
import static org.objectweb.asm.Opcodes.ASM6;
import java.io.IOException;
import java.lang.reflect.Field;
public class ModifyFieldAccess {
public static class ModifyAccessVisitor extends ClassVisitor {
public ModifyAccessVisitor(int i, ClassVisitor classVisitor) {
super(i, classVisitor);
}
@Override
public FieldVisitor visitField(int access, String name, String descriptor, String signature, Object value) {
if(StringUtils.equals(name,"name")) {
return super.visitField(ACC_PUBLIC,name,descriptor,signature,value);
}
return super.visitField(access, name, descriptor, signature, value);
}
}
public static void main(String[] args) throws IOException, IllegalAccessException, InstantiationException, NoSuchFieldException {
String fullName = Demo.class.getName();
String fullNameType = fullName.replace(".","/");
ClassReader cr = new ClassReader(fullNameType);
ClassWriter cw = new ClassWriter(0);
ModifyAccessVisitor mv = new ModifyAccessVisitor(ASM6,cw);
cr.accept(mv,ClassReader.SKIP_DEBUG);
byte[] bytes = cw.toByteArray();
MyClassLoader classLoader = new MyClassLoader();
Class<?> cls = classLoader.defineClassPublic(fullName, bytes, 0, bytes.length);
Object o = cls.newInstance();
Field name = cls.getField("name");
name.set(o,"kobin");
Object nameValue = name.get(o);
System.out.println(nameValue);
Field age = cls.getField("age");
age.set(o,21);
Object ageValue = age.get(o);
System.out.println("age:"+ageValue);
}
}
package asm.demo2.modify.access;
public class Demo {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
package asm.demo2.modify.access;
public class MyClassLoader extends ClassLoader {
public Class<?> defineClassPublic(String name, byte[] b, int off, int len) throws ClassFormatError {
Class<?> clazz = defineClass(name, b, off, len);
return clazz;
}
}
2. 运行结果