javassist 的简单使用

来源:互联网 发布:网络机顶盒软件2017 编辑:程序博客网 时间:2024/06/06 18:20

在回顾struts2的知识的时候,发现导入经典的几个jar文件后,会报一个错误就是

java.lang.RuntimeException: java.lang.reflect.InvocationTargetException

。。。。。。

Caused by: java.lang.ClassNotFoundException: javassist.ClassPool

。。。。。。

在struts2后面的版本中添加了对javassist.jar的依赖


hibernate后面也用javassist.jar 替换了cglib.jar

cglib、javassist和jdk动态代理,都可以为我们生成代理类,从而进行aop的开发。

package com.ether.assist;public class Demo {  public void forJavassistTest(){System.out.println("----------执行方法forJavassistTest()-----------");  }}

import javassist.CannotCompileException;import javassist.ClassPool;import javassist.CtClass;import javassist.CtMethod;import javassist.CtNewMethod;import javassist.NotFoundException;public class JavassitTest {   public static void main(String[] args) throws NotFoundException, CannotCompileException, InstantiationException, IllegalAccessException{   CtClass ctClass=ClassPool.getDefault().get("com.ether.assist.Demo");   String oldName="forJavassistTest";   CtMethod ctMethod=ctClass.getDeclaredMethod(oldName);   String newName=oldName+"$impl";   ctMethod.setName(newName);   CtMethod newMethod=CtNewMethod.copy(ctMethod,"forJavassistTest",ctClass, null);   StringBuffer sb=new StringBuffer();   sb.append("{System.out.println(\"22222222\");\n")     .append(newName+"($$);\n")     .append("System.out.println(\"11111111111\");\n}");   newMethod.setBody(sb.toString());         //增加新方法         ctClass.addMethod(newMethod);        //类已经更改,注意不能使用A a=new A();,因为在同一个classloader中,不允许装载同一个类两次         Demo a=(Demo)ctClass.toClass().newInstance();         a.forJavassistTest();    }}body里是这样的字符串:{System.out.println("22222222");forJavassistTest$impl($$);System.out.println("11111111111");} 这里的forJavaassistTest$impl($$);类似方法调用。
执行结果为:

22222222
----------执行方法forJavassistTest()-----------
11111111111




原创粉丝点击