Java动态编程之javassit

什么是动态编程

动态编程是相对于静态编程而言的,平时我们讨论比较多的就是静态编程语言,例如Java,与动态编程语言,例如JavaScript。那二者有什么明显的区别呢?简单的说就是在静态编程中,类型检查是在编译时完成的,而动态编程中类型检查是在运行时完成的。所谓动态编程就是绕过编译过程在运行时进行操作的技术,在Java中有如下几种方式:

反射

这个搞Java的应该比较熟悉,原理也就是通过在运行时获得类型信息然后做相应的操作。

动态编译
动态编译是从Java 6开始支持的,主要是通过一个JavaCompiler接口来完成的。通过这种方式我们可以直接编译一个已经存在的java文件,也可以在内存中动态生成Java代码,动态编译执行。

调用JavaScript引擎
Java 6加入了对Script(JSR223)的支持。这是一个脚本框架,提供了让脚本语言来访问Java内部的方法。你可以在运行的时候找到脚本引擎,然后调用这个引擎去执行脚本。这个脚本API允许你为脚本语言提供Java支持。

动态生成字节码
这种技术通过操作Java字节码的方式在JVM中生成新类或者对已经加载的类动态添加元素。

Javassit使用方法

Javassist是一个开源的分析、编辑和创建Java字节码的类库。是由东京工业大学的数学和计算机科学系的 Shigeru Chiba (千叶 滋)所创建的。它已加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作为JBoss实现动态AOP框架。javassist是jboss的一个子项目,其主要的优点,在于简单,而且快速。直接使用java编码的形式,而不需要了解虚拟机指令,就能动态改变类的结构,或者动态生成类。
核心类
ClassPool:map结构 key为类名 value为CtClass

CtClass:拿到对应的操作类对象

CtField:构造类字段

CtMethod:操作方法,能赋到CtClass上 成为一个新方法

CtConstructor:操作构造方法 赋值到CtClass 成为一个新的构造方法
举例

 public static void main(String[] args) throws Exception {
        ClassPool pool = ClassPool.getDefault();
        CtClass person = pool.makeClass("com.test.bytecodeop.Person");
        
        //创建属性
        CtField name = CtField.make("private String name;", person);
        CtField age = CtField.make("private int age;", person);
        person.addField(name);
        person.addField(age);
        
        //创建方法
        CtMethod getName = CtMethod.make("public String getName(){return name;}", person);
        CtMethod setName = CtMethod.make("public void setName(String name){this.name=name;}", person);
        person.addMethod(getName);
        person.addMethod(setName);
        
        //创建构造器        
        CtConstructor constructor = new CtConstructor(new CtClass[]{pool.get("java.lang.String"),CtClass.intType},person);
        constructor.setBody("{this.name=name; this.age=age;}");
        person.addConstructor(constructor);
        
        person.writeFile("c:/Person");
        System.out.println("success");
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值