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)数组,数组的顺序为
相关文章推荐
- 如何在SpringMVC框架中利用Java反射机制和Javassist实现Java对象、属性、注解的动态创建生成
- 如何使用HTML5实现利用摄像头拍照上传功能(java版)
- Java利用数组随机抽取幸运观众如何实现
- 如何利用SOE for Java实现数据编辑
- 利用Java反射机制和Javassist实现Java对象及其属性的动态创建生成
- Java:如何利用两个栈实现队列
- 利用Java反射机制和Javassist实现Java对象及其属性的动态创建生成
- 详细讲解如何利用Java实现组合式解析器?
- Java利用happen-before规则如何实现共享变量的同步操作详解
- java如何利用第三方Quartz实现定时任务
- 如何利用java实现浮点数的精确计算
- 如何使用HTML5实现利用摄像头拍照上传功能(java版)
- 如何用Java实现利用搜索引擎收集网址的程序
- 三个利用Java实现zip压缩/解压缩方法
- 如何利用WIN2000实现两个网段的路由
- Java初学者如何迈出AOP第一步--使用Java 动态代理实现AOP
- 如何在Java中实现远程方法调用
- Java初学者如何迈出AOP第一步--使用Java 动态代理实现AOP
- Java初学者如何迈出AOP第一步--使用Java 动态代理实现AOP
- 在java中利用动态编译实现eval