您的位置:首页 > 编程语言 > Java开发

JAVA中如何利用javassist实现动态编程

2017-08-19 12:00 459 查看

JAVA的动态性

字节码操作

反射

运行时操作字节码可以让我们实现如下功能:

动态生成新的类

动态改变某个类的结构

优势

比反射开销小,性能高

JAVAssist性能高于反射,低于ASM

使用

需导入javassist包

//1.获得类池
ClassPool pool = ClassPool.getDefault();
//2.创建类
CtClass ctClass = pool.makeClass("com.earnest.Emp");
//3.创建属性
CtField name = CtField.make("private String name;", ctClass);//属性定义 对象
CtField age = CtField.make("private int age;", ctClass);
//4.添加属性
ctClass.addField(name);
ctClass.addField(age);
//5.创建方法
CtMethod make = CtMethod.make("public String getName() {return name;}", ctClass);
CtMethod make1 = CtMethod.make("public void setName(String name) {this.name = name;}", ctClass);
//6.添加方法
ctClass.addMethod(make);
ctClass.addMethod(make1);
//7.添加构造器
CtConstructor ctConstructor = new CtConstructor(new CtClass[]{}, ctClass);//无参数构造器
ctConstructor.setBody("{}");
CtConstructor ctConstructor1 = new CtConstructor(new CtClass[]{CtClass.intType, pool.get("java.lang.String")}, ctClass);//指定参数构造器
ctConstructor1.setBody("{this.name=$2;this.age=$1;}");//$1代表第一个参数,$2代表第二个参数,$0代表this
//8.添加构造器
ctClass.addConstructor(ctConstructor);
ctClass.addConstructor(ctConstructor1);
//8.写入工作空间c:/myJava
ctClass.writeFile("c:/myJava");


$0,$1,$2
:分别代表
this
,第一个参数,第二个参数。

$args
:将所有参数做为数组放入。

$$
:所有方法参数的简写,主要用在方法调用上。
move(String a,String b)
相当于
move($$)


$cflow
:一个方法调用的深度。

$r
:方法返回值的类型。

$_
:方法返回值。(修改方法时不支持)。

addCatch()
:方法中加入
try catch
块,
$e
代表异常。

$class
:
this
的类型(
Class
)。也就是
$0
的类型。

$sig
;方法参数的类型(
Class
)数组,数组的顺序为
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: