java 操作字节码 javasist

注:需导入javasist-*.jar包

一、Javasist生成新的类

package com.org.asist;

import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtConstructor;
import javassist.CtField;
import javassist.CtMethod;

public class Ceshi01 {

    public static void main(String[] args) throws Exception {
        ClassPool pool = ClassPool.getDefault();
        
        CtClass cc = pool.makeClass("com.org.asist.Staff");
        
        //创建属性
        
        CtField f1 = CtField.make("private String staffNo;", cc);
        CtField f2 = CtField.make("private String staffName;", cc);
        cc.addField(f1);
        cc.addField(f2);
        
        //创建方法
        CtMethod method = CtMethod.make("public String getStaffNo(){return staffNo;}", cc);
        CtMethod method2 = CtMethod.make("public void setStaffNo(){this.staffNo = staffNo;}", cc);
        cc.addMethod(method);
        cc.addMethod(method2);
        
        //添加构造器
        CtConstructor constructor = new CtConstructor(new CtClass[]{pool.get("java.lang.String"),pool.get("java.lang.String")}, cc);
        //添加方法体
        constructor.setBody("{this.staffNo = staffNo;this.staffName = staffName;}");
        
        cc.addConstructor(constructor);
        //写入工作空间
        cc.writeFile("d:/myjava");
        
        
        
    }
}
二、Javasist操作API

package com.org.asist;

import java.lang.reflect.Method;

import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.CtNewMethod;
import javassist.Modifier;

public class Ceshi02 {

    //处理类的基本方法
    public static void test01() throws Exception{
        ClassPool pool = ClassPool.getDefault();
        CtClass cc = pool.get("com.org.asist.Staff");

        System.out.println(cc.getName());
        System.out.println(cc.getPackageName());
        System.out.println(cc.getConstructors()[0]);
        System.out.println(cc.getClass());
    }
    
    
    //测试产生新的方法
    public static void test02() throws Exception{
        ClassPool pool = ClassPool.getDefault();
        //CtClass cc = pool.get("com.org.asist.Staff");
        CtClass cc = pool.makeClass("com.org.asist.Staff");
        //CtMethod m = CtNewMethod.make("public int add(int a,int b){return a+b;}", cc);
        System.out.println(cc.getSimpleName());
        //创建方法
        CtMethod m = new CtMethod(CtClass.intType, "add", new CtClass[]{CtClass.intType,CtClass.intType},cc);
        m.setModifiers(Modifier.PUBLIC);
        m.setBody("{return $1+$2;}");//$1、$2表示占位符
        cc.addMethod(m);
        
        
        Class clazz = cc.toClass();
        Object object = clazz.newInstance();//通过无参构造器,创建一个新的对象
        Method method = clazz.getDeclaredMethod("add", int.class,int.class);
        Object result = method.invoke(object, 200,300);
        System.out.println(result);
        
        
    }
    /**
     * 任意修改已有的方法信息(类似于aop底层实现)
     * @throws Exception
     */
    public static void test03() throws Exception{
        ClassPool pool = ClassPool.getDefault();
        CtClass cc = pool.get("com.org.asist.Staff");
        
        CtMethod cm = cc.getDeclaredMethod("sayHello", new CtClass[]{pool.get("java.lang.String")});
        cm.insertBefore("System.out.println($1);");
        cm.insertAfter("System.out.println(\"我靠你妹的\");");
        Class clazz = cc.toClass();
        Object object = clazz.newInstance();//通过无参构造器,创建一个新的对象
        Method method = clazz.getDeclaredMethod("sayHello", String.class);
        Object result = method.invoke(object, "你妹");
        System.out.println(result);
        
        
    }
    
    /**
     * 属性操作
     * @throws Exception
     */
    public static void test04() throws Exception{
        ClassPool pool = ClassPool.getDefault();
        CtClass cc = pool.get("com.org.asist.Staff");
        
        CtField field = new CtField(CtClass.intType, "age", cc);
        
        field.setModifiers(Modifier.PRIVATE);
        cc.addField(field);
        
        cc.addMethod(CtNewMethod.getter("getAge", field));
        cc.addMethod(CtNewMethod.getter("setAge", field));
        
        
        
    }
    
    /**
     * 操作构造器
     * @throws Exception
     */
    public static void test05() throws Exception{
        ClassPool pool = ClassPool.getDefault();
        CtClass cc = pool.get("com.org.asist.Staff");
        
        CtConstructor[] con = cc.getConstructors();
        
        for (CtConstructor ctConstructor : con) {
            System.out.println(ctConstructor);
        }
        
    }
    public static void main(String[] args) throws Exception {
        test02();
    }
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值