Java常见的字节操作

来源:互联网 发布:协同办公软件a8 编辑:程序博客网 时间:2024/06/06 08:52

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtField;
import javassist.CtMethod;
import javassist.CtNewMethod;
import javassist.Modifier;


public class Test32 {


// 通过javaSsist添加字节码
public static void main(String[] args) throws Exception {


// 加载class字节文件
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get("cn.david.newtest.User");


// 字节操作定义变量
CtField field = new CtField(CtClass.intType, "sex", cc);
field.setModifiers(Modifier.PRIVATE);
cc.addField(field, "100");
// 通过字节操作自定义set和get方法
CtMethod m1 = CtNewMethod.getter("getSex", field);
CtMethod m2 = CtNewMethod.getter("setSex", field);
cc.addMethod(m1);
cc.addMethod(m2);


// 字节操作定义函数
CtMethod method = new CtMethod(CtClass.intType, "add", new CtClass[] { CtClass.intType, CtClass.intType }, cc);
method.setModifiers(Modifier.PUBLIC);
method.setBody("{return $1+$2;}");
cc.addMethod(method);


// 通过反射调用定义的方法
Class<?> clazz = cc.toClass();
User user = (User) clazz.newInstance();
Method m = clazz.getDeclaredMethod("add", int.class, int.class);
Object object = m.invoke(user, 12, 21);
System.out.println(object);


// 通过反射调用定义的变量
Field f = clazz.getDeclaredField("sex");
f.setAccessible(true);
System.out.println(f.get(user));

}


}


class User {
}
0 0