写在前面
源码 。
本文看下如何使用javassist来定义方法和返回值。
1:源码
package com.dahuyou.javassist.generateFieldAndMethod;
import javassist.*;
import java.lang.reflect.Method;
public class JustDoIt222 {
public static void main(String[] args) throws Exception {
ClassPool pool = ClassPool.getDefault();
CtClass ctClass = pool.makeClass("com.dahuyou.javassist.generateFieldAndMethod.generateFieldAndMethod_javassist");
// 创建属性字段
CtField ctFieldPI = new CtField(CtClass.doubleType, "pi", ctClass);
ctFieldPI.setModifiers(Modifier.PRIVATE + Modifier.STATIC + Modifier.FINAL);
ctClass.addField(ctFieldPI, "3.14");
// 求园面积的方法
CtMethod calcMethod = new CtMethod(CtClass.doubleType, "calc", new CtClass[]{CtClass.doubleType}, ctClass);
calcMethod.setModifiers(Modifier.PUBLIC);
calcMethod.setBody("{return pi * $1 * $1;}");
ctClass.addMethod(calcMethod);
ctClass.writeFile();
// 反射运行测试
Class aClass = ctClass.toClass();
Object obj = aClass.newInstance();
Method main = aClass.getDeclaredMethod("calc", double.class);
System.out.println(main.invoke(obj, 8D));
}
}
以上$1,$2分别别表示第1个,第二个参数,以此类推,有点像linux的shell脚本取参数的方式。另外$0表示this。运行一下:
200.96
Process finished with exit code 0
生成的字节码: