javasist代码实现解析

概述

Javassist是一个开源的分析、编辑和创建Java字节码的类库,可以直接编辑和生成Java生成的字节码。相对于bcel, asm等这些工具,开发者不需要了解虚拟机指令,就能动态改变类的结构,或者动态生成类。javassist简单易用, 快速。

重要的类

ClassPool:javassist的类池,使用ClassPool 类可以跟踪和控制所操作的类,它的工作方式与 JVM 类装载器非常相似
CtClass: CtClass提供了类的操作,如在类中动态添加新字段、方法和构造函数、以及改变类、父类和接口的方法。
CtField:类的属性,通过它可以给类创建新的属性,还可以修改已有的属性的类型,访问修饰符等
CtMethod:类中的方法,通过它可以给类创建新的方法,还可以修改返回类型,访问修饰符等, 甚至还可以修改方法体内容代码
CtConstructor:与CtMethod类

API运用

ClassPool

// 类库, jvm中所加载的class
ClassPool pool = ClassPool.getDefault();
// 加载一个已知的类, 注:参数必须为全量类名
CtClass ctClass = pool.get(“com.itheima.Student”);
// 创建一个新的类, 类名必须为全量类名
CtClass tClass = pool.makeClass(“com.itheima.Calculator”);
CtField

// 获取已知类的属性
CtField ctField = ctClass.getDeclaredField(“name”);
// 构建新的类的成员变量
CtField ctFieldNew = new CtField(CtClass.intType,“age”,ctClass);
// 设置类的访问修饰符为public
ctFieldNew.setModifiers(Modifier.PUBLIC);
// 将属性添加到类中
ctClass.addField(ctFieldNew);
CtMethod

1 // 获取已有方法

2 CtMethod ctMethod = ctClass.getDeclaredMethod(“sayHello”);

3 //创建新的方法, 参数1:方法的返回类型,参数2:名称,参数3:方法的参数,参数4:方法所属的类

5 CtMethod ctMethod = new CtMethod(CtClass.intType, “calc”, new CtClass[]

{CtClass.intType,CtClass.intType}, tClass);

6 // 设置方法的访问修饰

7 ctMethod.setModifiers(Modifier.PUBLIC);

8 // 将新建的方法添加到类中

9 ctClass.addMethod(ctMethod);

10 // 方法体内容代码 $1代表第一个参数,$2代表第二个参数

ctMethod.setBody(“return $1 + $2;”);

11// 直接创建方法

CtMethod getMethod = CtNewMethod.make(“public int getAge() { return this.age;}”, ctClass); CtMethod setMethod = CtNewMethod.make(“public void setAge(int age) { this.age = age;}”, ctClass);

ctClass.addMethod(getMethod);

ctClass.addMethod(setMethod);

// 类库池, jvm中所加载的class
   ClassPool pool = ClassPool.getDefault();
   
        String className = "com.test.IScriptDoMsg" + UUID.randomUUID().toString();
        // 创建类
        CtClass cc1 = pool.makeClass(className);
        CtClass[] its = new CtClass[]{pool.get("com.test.IScriptDoMsg")};
        //实现接口IScriptDoMsg
        cc1.setInterfaces(its);
        //创建方法
        CtMethod method = CtNewMethod.make("public void doMessage() {}", cc1);
        cc1.addMethod(method);
        //在方法里面插入数据
        method.insertBefore("{ System.out.println(\"Hello.doMessage():\"); }");
		//实例化创建类
        IScriptDoMsg h1 = (IScriptDoMsg)cc1.toClass().newInstance();
        //调用接口实现类的方法信息
        h1.doMessage();
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值