Javassist总结

Javassist 是一个Java字节码操作类库,Java字节码被保存在一个称为class文件的二进制文件中,每个类文件都包含一个Java类或接口。

对于动态生成二进制字节码 class 有许多开源项目提供支持,CGLib、ASM、Javassis。他们都能够动态创建新类或新接口的二进制字节码,动态扩展现有类或接口的二进制字节码。CGLib 底层基于 ASM 实现,是一个高效高性能的生成库;ASM 是一个轻量级类库,但需要涉及到 JVM 的操作和指令;javassist则完全基于 Java API,但是性能差一些

Javassist的官方网站如下:

http://www.csg.ci.i.u-tokyo.ac.jp/~chiba/javassist/

如下的链接是一个很好的Javassist代码示例:

http://yonglin4605.iteye.com/blog/1396494

如下的链接深入研究了Javassist中的一些语法,其中第8小节处对参数形式的总结很有作用:

http://zhxing.iteye.com/blog/1703305

如下的链接是IBM DW关于Javassist一个较为完整的教程:

http://www.ibm.com/developerworks/cn/java/j-dyn0916/

如下的代码是动态创建Java类二进制字节码并通过反射调用的示例,可供参考:

[java]  view plain copy
  1. import java.lang.reflect.InvocationTargetException;  
  2. import java.lang.reflect.Method;  
  3.   
  4. import javassist.CannotCompileException;  
  5. import javassist.ClassPool;  
  6. import javassist.CtClass;  
  7. import javassist.CtConstructor;  
  8. import javassist.CtField;  
  9. import javassist.CtNewMethod;  
  10. import javassist.Modifier;  
  11. import javassist.NotFoundException;  
  12. import javassist.CtField.Initializer;  
  13.   
  14. public class JavassistGenerator {  
  15.       
  16.     public static void main(String[] args) throws CannotCompileException, NotFoundException, InstantiationException, IllegalAccessException, ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException {  
  17.         // 创建类  
  18.         ClassPool pool = ClassPool.getDefault();  
  19.         CtClass cls = pool.makeClass("cn.ibm.com.TestClass");  
  20.           
  21.         // 添加私有成员name及其getter、setter方法  
  22.         CtField param = new CtField(pool.get("java.lang.String"), "name", cls);  
  23.         param.setModifiers(Modifier.PRIVATE);  
  24.         cls.addMethod(CtNewMethod.setter("setName", param));  
  25.         cls.addMethod(CtNewMethod.getter("getName", param));  
  26.         cls.addField(param, Initializer.constant(""));  
  27.           
  28.         // 添加无参的构造体  
  29.         CtConstructor cons = new CtConstructor(new CtClass[] {}, cls);  
  30.         cons.setBody("{name = \"Brant\";}");  
  31.         cls.addConstructor(cons);  
  32.           
  33.         // 添加有参的构造体  
  34.         cons = new CtConstructor(new CtClass[] {pool.get("java.lang.String")}, cls);  
  35.         cons.setBody("{$0.name = $1;}");  
  36.         cls.addConstructor(cons);  
  37.           
  38.         // 打印创建类的类名  
  39.         System.out.println(cls.toClass());  
  40.           
  41.         // 通过反射创建无参的实例,并调用getName方法  
  42.         Object o = Class.forName("cn.ibm.com.TestClass").newInstance();  
  43.         Method getter = o.getClass().getMethod("getName");  
  44.         System.out.println(getter.invoke(o));  
  45.           
  46.         // 调用其setName方法  
  47.         Method setter = o.getClass().getMethod("setName"new Class[] {String.class});  
  48.         setter.invoke(o, "Adam");  
  49.         System.out.println(getter.invoke(o));  
  50.           
  51.         // 通过反射创建有参的实例,并调用getName方法  
  52.         o = Class.forName("cn.ibm.com.TestClass").getConstructor(String.class).newInstance("Liu Jian");  
  53.         getter = o.getClass().getMethod("getName");  
  54.         System.out.println(getter.invoke(o));  
  55.     }  
  56.   
  57. }  


最后需要特别注意的是:

1.      Javassist不支持要创建或注入的类中存在泛型参数

2.      Javassist对@类型的注解(Annotation)只支持查询,不支持添加或修改


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值