insertat的java_java javassist库处理类的基本用法

java javassist库处理类的基本用法

public class Dema {

//获取原方法信息

public static void test01() throws Exception

{

ClassPool pool=ClassPool.getDefault();

CtClass cc=pool.get("cn.sxt.in.Emp"); //获得已有的类

byte[] bytes=cc.toBytecode(); //转换成字节码

System.out.println(cc.getName()); //获取类名

System.out.println(cc.getSimpleName()); //获取简要类名

System.out.println(cc.getSuperclass()); //获取父类

System.out.println(Arrays.toString(bytes));

System.out.println(cc.getInterfaces()); //获取接口,返回的是数组

}

//添加方法

public static void test02() throws Exception

{

ClassPool pool =ClassPool.getDefault();

CtClass cc=pool.get("cn.sxt.in.Emp");

//创建新方法

CtMethod m=CtNewMethod.make("public int add(int a,int b){return a+b;}", cc);

//创建新方法

CtMethod m2=new CtMethod(CtClass.intType,"add2",new CtClass[] {CtClass.intType,CtClass.intType},cc);

m2.setModifiers(Modifier.PUBLIC); //设置权限

m2.setBody("{System.out.println(\"yes\");return $1+$2;}"); //占位符代替形参名

cc.addMethod(m2);

cc.addMethod(m);

//通过反射调用新生成的方法

Class clazz=cc.toClass();

Object obj=clazz.newInstance(); //通过调用Emp的无参构造器,创建新的Emp对象

Method method=clazz.getDeclaredMethod("add2",int.class,int.class);

Object result=method.invoke(obj, 200,300);

System.out.println(result);

}

//修改方法

public static void test03() throws Exception

{

ClassPool pool=ClassPool.getDefault();

CtClass cc=pool.get("cn.sxt.in.Emp");

CtMethod cm=cc.getDeclaredMethod("sayHello",new CtClass[] {CtClass.intType});

//在方法开头添加内容

cm.insertBefore("System.out.println($1);System.out.println(\"start\");");

//在某一行前面加代码

cm.insertAt(8, "System.out.println(\"ugly\");");

//在方法后面加内容

cm.insertAfter("System.out.println(\"end\");");

Class clazz=cc.toClass();

Object obj=clazz.newInstance(); //通过调用Emp的无参构造器,创建新的Emp对象

Method method=clazz.getDeclaredMethod("sayHello",int.class);

method.invoke(obj,300);

}

//修改属性

public static void test04() throws Exception

{

ClassPool pool=ClassPool.getDefault();

CtClass cc=pool.get("cn.sxt.in.Emp");

CtField f1=CtField.make("private int emm;", cc);

CtField f2=new CtField(CtClass.intType,"emm2",cc);

f2.setModifiers(Modifier.PRIVATE);

cc.addField(f1,"100"); //传默认值

cc.addField(f2);

//cc.getDeclaredField("ename"); 获取指定属性

//增加相应的set和get方法

cc.addMethod(CtNewMethod.getter("getEmm2", f2));

cc.addMethod(CtNewMethod.getter("setEmm2", f2));

}

//构造器

public static void test05() throws Exception

{

ClassPool pool=ClassPool.getDefault();

CtClass cc=pool.get("cn.sxt.in.Emp");

CtConstructor[] cs= cc.getConstructors();

for(CtConstructor c:cs)

{

System.out.println(c.getLongName());

}

}

//调用注解

public static void test06() throws Exception

{

ClassPool pool=ClassPool.getDefault();

CtClass cc=pool.get("cn.sxt.in.Emp");

Object[] all=cc.getAnnotations();

Author a=(Author)all[0];

String name=a.name();

int year=a.year();

System.out.println("name:"+name+",year:"+year);

}

public static void main(String[] args) throws Exception {

test06();

}

}

©著作权归作者所有:来自51CTO博客作者wx5d21d5e6e5ab1的原创作品,如需转载,请注明出处,否则将追究法律责任

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值