阅读背景:

javajavassist库处理类的基本用法

来源:互联网 
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 
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();
}
}
+;}"); //占位符取代形参名 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(
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();
}
}
);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(); } }public class Dema { //获得原办法信息 public static void



你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: