`
xiangxingchina
  • 浏览: 506566 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

javassist学习一

 
阅读更多

前段时间为了公司里的线上工程监控用到了这个小jar包,看起来挺有用,学习下,做个笔记。

 

Javassist 基础

Javassist 使您可以检查、编辑以及创建 Java 二进制类。检查方面基本上与通过 Reflection API 直接在 Java 中进行的一样,但是当想要修改类而不只是执行它们时,则另一种访问这些信息的方法就很有用了。这是因为 JVM 设计上并没有提供在类装载到 JVM 中后访问原始类数据的任何方法,这项工作需要在 JVM 之外完成。

 

Javassist 使用 javassist.ClassPool 类跟踪和控制所操作的类。这个类的工作方式与 JVM 类装载器非常相似,但是有一个重要的区别是它不是将装载的、要执行的类作为应用程序的一部分链接,类池使所装载的类可以通过 Javassist API 作为数据使用。可以使用默认的类池,它是从 JVM 搜索路径中装载的,也可以定义一个搜索您自己的路径列表的类池。甚至可以直接从字节数组或者流中装载二进制类,以及从头开始创建新类。

装载到类池中的类由 javassist.CtClass 实例表示。与标准的 Java java.lang.Class 类一样, CtClass 提供了检查类数据(如字段和方法)的方法。不过,这只是 CtClass 的部分内容,它还定义了在类中添加新字段、方法和构造函数、以及改变类、父类和接口的方法。奇怪的是,Javassist 没有提供删除一个类中字段、方法或者构造函数的任何方法。

字段、方法和构造函数分别由 javassist.CtField、 javassist.CtMethod javassist.CtConstructor 的实例表示。这些类定义了修改由它们所表示的对象的所有方法的方法,包括方法或者构造函数中的实际字节码内容。

所有字节码的源代码
Javassist 让您可以完全替换一个方法或者构造函数的字节码正文,或者在现有正文的开始或者结束位置选择性地添加字节码(以及在构造函数中添加其他一些变量)。不管是哪种情况,新的字节码都作为类 Java 的源代码声明或者 String 中的块传递。Javassist 方法将您提供的源代码高效地编译为 Java 字节码,然后将它们插入到目标方法或者构造函数的正文中。

Javassist 接受的源代码与 Java 语言的并不完全一致,不过主要的区别只是增加了一些特殊的标识符,用于表示方法或者构造函数参数、方法返回值和其他在插入的代码中可能用到的内容。这些特殊标识符以符号 $ 开头,所以它们不会干扰代码中的其他内容。

 

对于在传递给 Javassist 的源代码中可以做的事情有一些限制。第一项限制是使用的格式,它必须是单条语句或者块。在大多数情况下这算不上是限制,因为可以将所需要的任何语句序列放 到块中。下面是一个使用特殊 Javassist 标识符表示方法中前两个参数的例子,这个例子用来展示其使用方法:

 

{
  System.out.println("Argument 1: " + $1);
  System.out.println("Argument 2: " + $2);
}

对于源代码的一项更实质性的限制是不能引用在所添加的声明或者块外声明的局部变量。这意味着如果在方法开始和结尾处都添加了代码,那么一般不能将在 开始处添加的代码中的信息传递给在结尾处添加的代码。有可能绕过这项限制,但是绕过是很复杂的 -- 通常需要设法将分别插入的代码合并为一个块。

 

 

======================================================================

写了个例子。

有一个类:

Java代码  收藏代码
  1. package  seeeyou.app.test;  
  2.   
  3.   
  4. public   class  HelloWorld {  
  5.       
  6.     public   static   void  sayHello(String hh) {  
  7.         try  {  
  8.             Thread.sleep(3000 );  
  9.         } catch  (InterruptedException e) {  
  10.             // TODO Auto-generated catch block   
  11.             e.printStackTrace();  
  12.         }  
  13.         System.out.println("hello world" );  
  14.     }  
  15.       
  16.   
  17. }  

 

要知道这个方法执行了多久,一般可以直接在sayHello这个方法的前面加

Java代码  收藏代码
  1. long  start = System.currentTimeMillis();  
Java代码  收藏代码
  1. 后面加  long  end= System.currentTimeMillis()  最后输出下end-start即可  

 

javassist不只是这些功能,还有其他功能。后面再介绍点。

另外一种用javassist的方式也很简单,而且不用在这时改变源代码。

例子如下:

Java代码  收藏代码
  1. package  seeeyou.app.test;  
  2.   
  3. import  javassist.CannotCompileException;  
  4. import  javassist.ClassPool;  
  5. import  javassist.CtClass;  
  6. import  javassist.CtMethod;  
  7. import  javassist.CtNewMethod;  
  8. import  javassist.NotFoundException;  
  9.   
  10. /**  
  11.  * 这个例子里用javassist在加载类的时候,给HelloWorld这个类的sayHello方法动态的加入统计方法时间的代码  
  12.  *   
  13.  * @author seeeyou  
  14.  *   
  15.  */   
  16. public   class  TestHelloWorld {  
  17.     public   static   void  main(String[] args)  throws  NotFoundException,  
  18.             InstantiationException, IllegalAccessException,  
  19.             CannotCompileException {  
  20.         // 用于取得字节码类,必须在当前的classpath中,使用全称   
  21.         CtClass ctClass = ClassPool.getDefault().getCtClass("seeeyou.app.test.HelloWorld" );  
  22.         // 需要修改的方法名称   
  23.         String mname = "sayHello" ;  
  24.         // 新定义一个方法叫做sayHello$impl   
  25.         String newMethodName = mname + "$impl" ;  
  26.         // 获取这个方法   
  27.         CtMethod cm = ctClass.getDeclaredMethod(mname);  
  28.         cm.setName(newMethodName);// 原来的方法改个名字   
  29.   
  30.         //创建新的方法,复制原来的方法   
  31.         CtMethod newMethod = CtNewMethod.copy(cm, mname, ctClass, null );  
  32.   
  33.         StringBuilder bodyStr = new  StringBuilder();  
  34.         bodyStr.append("{\nlong start = System.currentTimeMillis();\n" );  
  35.         // 调用原有代码,类似于method();($$)表示所有的参数   
  36.         bodyStr.append(newMethodName + "($$);\n" );  
  37.   
  38.         bodyStr.append("System.out.println(\"Call to method "  + mname  
  39.                 + " took \" +\n (System.currentTimeMillis()-start) + "   
  40.                 + "\" ms.\");\n" );  
  41.   
  42.         bodyStr.append("}" );  
  43.         // 替换新方法   
  44.         newMethod.setBody(bodyStr.toString());  
  45.         // 增加新方法   
  46.         ctClass.addMethod(newMethod);  
  47.   
  48.         // 类已经更改,注意不能使用HelloWorld a=new   
  49.         // HelloWorld();,因为在同一个classloader中,不允许装载同一个类两次   
  50.   
  51.         HelloWorld helloWorld = (HelloWorld) ctClass.toClass().newInstance();  
  52.         helloWorld.sayHello("add" );  
  53.     }  
  54. }  

 

 运行结果如下:

Java代码  收藏代码
  1. hello world  
  2. Call to method sayHello took 3000  ms.

     上面这个例子,是可以直接运行的。

    javassist不只是这些功能,还有一些其他很好的功能,后面有空再记录下。

 ====================================================================

这里举个简单的例子,来记录下如何用CtClass创建一个类,并且往这个类里面新加方法,

下面是代码,可以直接运行:

Java代码  收藏代码
  1. package  seeeyou.app.test;  
  2.   
  3. import  java.io.IOException;  
  4. import  java.lang.reflect.InvocationTargetException;  
  5. import  java.lang.reflect.Method;  
  6.   
  7. import  javassist.CannotCompileException;  
  8. import  javassist.ClassPool;  
  9. import  javassist.CtClass;  
  10. import  javassist.CtMethod;  
  11. import  javassist.CtNewMethod;  
  12. import  javassist.NotFoundException;  
  13.   
  14. /**  
  15.  *   
  16.  * @author seeeyou  
  17.  *   
  18.  */   
  19. public   class  TestHelloWorld2 {  
  20.     public   static   void  main(String[] args)  throws  NotFoundException,  
  21.             IOException, CannotCompileException, InstantiationException,  
  22.             IllegalAccessException, SecurityException, NoSuchMethodException,  
  23.             IllegalArgumentException, InvocationTargetException {  
  24.         // 用于取得字节码类,必须在当前的classpath中,使用全称   
  25.         ClassPool pool = ClassPool.getDefault();  
  26.         /**  
  27.          * makeClass() cannot create a new interface; makeInterface() in  
  28.          * ClassPool can do. Member methods in an interface can be created with  
  29.          * abstractMethod() in CtNewMethod. Note that an interface method is an  
  30.          * abstract method.  
  31.          */   
  32.         CtClass ccClass = pool.makeClass("Point" );  
  33.         String bodyString = "{System.out.println(\"Call to method \");}" ;  
  34.         //为新创建的类新加一个方法execute,无任何参数   
  35.         CtMethod n1 = CtNewMethod.make(CtClass.voidType, "execute" null null ,  
  36.                 bodyString, ccClass);  
  37.         ccClass.addMethod(n1);  
  38.         /**  
  39.          * 这里无法用new的形式来创建一个对象,因为已经classloader中不能有两个相同的对象,否则会报异常如下:  
  40.         *Caused by: java.lang.LinkageError: loader (instance of  sun/misc/Launcher$AppClassLoader):   
  41.         *attempted  duplicate class definition for name: "Point"  
  42.         **/   
  43.         Object oo = ccClass.toClass().newInstance();  
  44.         Method mms = oo.getClass().getMethod("execute" null );  
  45.         System.out.println("new class name is : "  + oo.getClass().getName());  
  46.         System.out.println("new class's method is : "  + mms.invoke(oo,  null ));  
  47.         System.out.println("---------------------------------------------" );  
  48.         //这一行代码将class冻结了,下面无法再对类多编辑或者修改,下面的setName会报异常如:   
  49.         //Exception in thread "main" java.lang.RuntimeException: Point class is frozen   
  50.         ccClass.freeze();  
  51.         try {  
  52.             ccClass.setName("Point2" );  
  53.         }catch  (Exception e) {  
  54.             System.out.println(e);  
  55.         }  
  56.         //对已经冻结的class解冻之后还可以继续编辑修改   
  57.          ccClass.defrost();  
  58.         <span style="color: #ff0000;" > System.out.println( "------------- 上面的代码是对的,下面的代码将会无法执行出结果,会报错------------------------" );</span>  
  59.          //第二个方法   
  60.          bodyString = "public int getNumber(Integer num){System.out.println(\"Point2 Call to method \");return 10+num;}" ;  
  61.          CtMethod n2 = CtNewMethod.make(bodyString, ccClass);//直接创建一个方法,带有一个int的参数和返回值   
  62.          ccClass.addMethod(n2);  
  63.          Class[] params = new  Class[ 1 ];  
  64.          Integer num = new  Integer( 15 );  
  65.          params[0 ] = num.getClass();  
  66.          mms = oo.getClass().getMethod("getNumber" , params);  
  67.         System.out.println("new class name is : "  + oo.getClass().getName());  
  68.         System.out.println("new class's method is : "  + mms.invoke(oo,  100 ));  
  69.         System.out.println("---------------------------------------------" );  
  70.     }  
  71. }  
Java代码  收藏代码
  1. 上面的结果是: new   class  name is : Point  
  2. Call to method   
  3. new   class 's method is :  null   
  4. ---------------------------------------------  
  5. java.lang.RuntimeException: Point class  is frozen  
  6. ---------------------------------------------  
  7. Exception in thread "main"  java.lang.NoSuchMethodException: Point.getNumber(java.lang.Integer)  
  8.  at java.lang.Class.getMethod(Class.java:1605 )  
  9.  at seeeyou.app.test.TestHelloWorld2.main(TestHelloWorld2.java:66 )  

 

错误的原因其实和简单,因为我第二次新加一个方法后,没有再次实例化一个对象,所以oo还是原来的对象,他的成员函数肯定没有新加的方法。

那我可以再次实例化下试试,代码和结果如下:

Java代码  收藏代码
  1. package  seeeyou.app.test;  
  2.   
  3. import  java.io.IOException;  
  4. import  java.lang.reflect.InvocationTargetException;  
  5. import  java.lang.reflect.Method;  
  6.   
  7. import  javassist.CannotCompileException;  
  8. import  javassist.ClassPool;  
  9. import  javassist.CtClass;  
  10. import  javassist.CtMethod;  
  11. import  javassist.CtNewMethod;  
  12. import  javassist.NotFoundException;  
  13.   
  14. /**  
  15.  *   
  16.  * @author seeeyou  
  17.  *   
  18.  */   
  19. public   class  TestHelloWorld2 {  
  20.     public   static   void  main(String[] args)  throws  NotFoundException,  
  21.             IOException, CannotCompileException, InstantiationException,  
  22.             IllegalAccessException, SecurityException, NoSuchMethodException,  
  23.             IllegalArgumentException, InvocationTargetException {  
  24.         // 用于取得字节码类,必须在当前的classpath中,使用全称   
  25.         ClassPool pool = ClassPool.getDefault();  
  26.         /**  
  27.          * makeClass() cannot create a new interface; makeInterface() in  
  28.          * ClassPool can do. Member methods in an interface can be created with  
  29.          * abstractMethod() in CtNewMethod. Note that an interface method is an  
  30.          * abstract method.  
  31.          */   
  32.         CtClass ccClass = pool.makeClass("Point" );  
  33.         String bodyString = "{System.out.println(\"Call to method \");}" ;  
  34.         //为新创建的类新加一个方法execute,无任何参数   
  35.         CtMethod n1 = CtNewMethod.make(CtClass.voidType, "execute" null null ,  
  36.                 bodyString, ccClass);  
  37.         ccClass.addMethod(n1);  
  38.         /**  
  39.          * 这里无法用new的形式来创建一个对象,因为已经classloader中不能有两个相同的对象,否则会报异常如下:  
  40.         *Caused by: java.lang.LinkageError: loader (instance of  sun/misc/Launcher$AppClassLoader):   
  41.         *attempted  duplicate class definition for name: "Point"  
  42.         **/   
  43.         Object oo = ccClass.toClass().newInstance();  
  44.         Method mms = oo.getClass().getMethod("execute" null );  
  45.         System.out.println("new class name is : "  + oo.getClass().getName());  
  46.         System.out.println("new class's method is : "  + mms.invoke(oo,  null ));  
  47.         System.out.println("---------------------------------------------" );  
  48.         //这一行代码将class冻结了,下面无法再对类多编辑或者修改,下面的setName会报异常如:   
  49.         //Exception in thread "main" java.lang.RuntimeException: Point class is frozen   
  50.         ccClass.freeze();  
  51.         try {  
  52.             ccClass.setName("Point2" );  
  53.         }catch  (Exception e) {  
  54.             System.out.println(e);  
  55.         }  
  56.         //对已经冻结的class解冻之后还可以继续编辑修改   
  57.          ccClass.defrost();  
  58.          System.out.println("------------- 上面的代码是对的,下面的代码将会无法执行出结果,会报错------------------------" );  
  59.          //第二个方法   
  60.          bodyString = "public int getNumber(Integer num){System.out.println(\"Point2 Call to method \");return 10+num;}" ;  
  61.          CtMethod n2 = CtNewMethod.make(bodyString, ccClass);//直接创建一个方法,带有一个int的参数和返回值   
  62.          ccClass.addMethod(n2);  
  63.          Class[] params = new  Class[ 1 ];  
  64.          Integer num = new  Integer( 15 );  
  65.          params[0 ] = num.getClass(); //就多了下面这个实例化,但是这样会导致一个错误   
  66.          oo = ccClass.toClass().newInstance();  
  67.          mms = oo.getClass().getMethod("getNumber" , params);  
  68.         System.out.println("new class name is : "  + oo.getClass().getName());  
  69.         System.out.println("new class's method is : "  + mms.invoke(oo,  100 ));  
  70.         System.out.println("---------------------------------------------" );  
  71.     }  
  72. }  
Java代码  收藏代码
  1. 这也会导致一个错误: new   class  name is : Point  
  2. Call to method   
  3. new   class 's method is :  null   
  4. ---------------------------------------------  
  5. java.lang.RuntimeException: Point class  is frozen  
  6. ------------- 上面的代码是对的,下面的代码将会无法执行出结果,会报错------------------------  
  7. Exception in thread "main"  javassist.CannotCompileException: by java.lang.LinkageError: loader (instance of  sun/misc/Launcher$AppClassLoader): attempted  duplicate  class  definition  for  name:  "Point"   
  8.  at javassist.ClassPool.toClass(ClassPool.java:1051 )  
  9.  at javassist.ClassPool.toClass(ClassPool.java:994 )  
  10.  at javassist.ClassPool.toClass(ClassPool.java:952 )  
  11.  at javassist.CtClass.toClass(CtClass.java:1079 )  
  12.  at seeeyou.app.test.TestHelloWorld2.main(TestHelloWorld2.java:66 )  
  13. Caused by: java.lang.LinkageError: loader (instance of  sun/misc/Launcher$AppClassLoader): attempted  duplicate class  definition  for  name:  "Point"   
  14.  at java.lang.ClassLoader.defineClass1(Native Method)  
  15.  at java.lang.ClassLoader.defineClass(ClassLoader.java:621 )  
  16.  at java.lang.ClassLoader.defineClass(ClassLoader.java:466 )  
  17.  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  
  18.  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39 )  
  19.  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25 )  
  20.  at java.lang.reflect.Method.invoke(Method.java:597 )  
  21.  at javassist.ClassPool.toClass2(ClassPool.java:1063 )  
  22.  at javassist.ClassPool.toClass(ClassPool.java:1045 )  
  23.  ... 4  more  
Java代码  收藏代码
  1. 原因也很简单,一个classloader里面怎么有两个重复的对象呢,除非是两个不同的classloader。。所以爆了个重复加载类的错误  
Java代码  收藏代码
  1.   

 

对的方式是只实例化一次:如下:

Java代码  收藏代码
  1. package  seeeyou.app.test;  
  2.   
  3. import  java.io.IOException;  
  4. import  java.lang.reflect.InvocationTargetException;  
  5. import  java.lang.reflect.Method;  
  6.   
  7. import  javassist.CannotCompileException;  
  8. import  javassist.ClassPool;  
  9. import  javassist.CtClass;  
  10. import  javassist.CtMethod;  
  11. import  javassist.CtNewMethod;  
  12. import  javassist.NotFoundException;  
  13.   
  14. /**  
  15.  *   
  16.  * @author seeeyou  
  17.  *   
  18.  */   
  19. public   class  TestHelloWorld3 {  
  20.   
  21.     public   static   void  main(String[] args)  throws  NotFoundException,  
  22.             IOException, CannotCompileException, InstantiationException,  
  23.             IllegalAccessException, SecurityException, NoSuchMethodException,  
  24.             IllegalArgumentException, InvocationTargetException {  
  25.         // 用于取得字节码类,必须在当前的classpath中,使用全称   
  26.         ClassPool pool = ClassPool.getDefault();  
  27.         /**  
  28.          * makeClass() cannot create a new interface; makeInterface() in  
  29.          * ClassPool can do. Member methods in an interface can be created with  
  30.          * abstractMethod() in CtNewMethod. Note that an interface method is an  
  31.          * abstract method.  
  32.          */   
  33.         CtClass ccClass = pool.makeClass("Point" );  
  34.         String bodyString = "{System.out.println(\"Call to method \");}" ;  
  35.         //为新创建的类新加一个方法execute,无任何参数   
  36.         CtMethod n1 = CtNewMethod.make(CtClass.voidType, "execute" null null ,  
  37.                 bodyString, ccClass);  
  38.         ccClass.addMethod(n1);  
  39.         //新加第二个方法   
  40.          bodyString = "public Integer getNumber(Integer num);" ;  
  41.          CtMethod n2 = CtNewMethod.make(bodyString, ccClass);//直接创建一个方法,带有一个int的参数和返回值   
  42.          n2.setBody("{System.out.println(\"Point Call to method \");return $1;}" );  
  43.          ccClass.addMethod(n2);  
  44.   
  45.         /**  
  46.          * 这里无法用new的形式来创建一个对象,因为已经classloader中不能有两个相同的对象,否则会报异常如下:  
  47.         *Caused by: java.lang.LinkageError: loader (instance of  sun/misc/Launcher$AppClassLoader):   
  48.         *attempted  duplicate class definition for name: "Point"  
  49.         **/   
  50.         Object oo = ccClass.toClass().newInstance();  
  51.         Method mms = oo.getClass().getMethod("execute" null );  
  52.         System.out.println("new class name is : "  + oo.getClass().getName());  
  53.         System.out.println("new class's method is : "  + mms.invoke(oo,  null ));  
  54.         System.out.println("---------------------------------------------" );  
  55.         //这一行代码将class冻结了,下面无法再对类多编辑或者修改,下面的setName会报异常如:   
  56.         //Exception in thread "main" java.lang.RuntimeException: Point class is frozen   
  57.         ccClass.freeze();  
  58.         try {  
  59.             ccClass.setName("Point2" );  
  60.         }catch  (Exception e) {  
  61.             System.out.println(e);  
  62.         }  
  63.         //对已经冻结的class解冻之后还可以继续编辑修改   
  64.          ccClass.defrost();  
  65.          System.out.println("------------- 上面的代码是对的,下面的代码将会无法执行出结果,会报错------------------------" );         
  66.          Class[] params = new  Class[ 1 ];  
  67.          Integer num = new  Integer( 0 );  
  68.          params[0 ] = num.getClass();  
  69.          mms = oo.getClass().getMethod("getNumber" ,params);  
  70.         System.out.println("new class name is : "  + oo.getClass().getName());  
  71.         System.out.println("new class's method is : "  + mms.invoke(oo,  100 ));  
  72.         System.out.println("---------------------------------------------" );  
  73.     }  
  74. }  
Java代码  收藏代码
  1. 结果如下: new   class  name is : Point  
  2. Call to method   
  3. new   class 's method is :  null   
  4. ---------------------------------------------  
  5. java.lang.RuntimeException: Point class  is frozen  
  6. ------------- 上面的代码是对的,下面的代码将会无法执行出结果,会报错------------------------  
  7. new   class  name is : Point  
  8. Point2 Call to method   
  9. new   class 's method is :  100   
  10. --------------------------------------------- 

 

分享到:
评论

相关推荐

    Javassist学习手册

    Javassist学习手册,API,快速入门

    javassist-3.23.1-GA-API文档-中文版.zip

    赠送jar包:javassist-3.23.1-GA.jar; 赠送原API文档:javassist-3.23.1-GA-javadoc.jar; 赠送源代码:javassist-3.23.1-GA-sources.jar; 赠送Maven依赖信息文件:javassist-3.23.1-GA.pom; 包含翻译后的API文档...

    开发工具 javassist-3.21.0-GA

    开发工具 javassist-3.21.0-GA开发工具 javassist-3.21.0-GA开发工具 javassist-3.21.0-GA开发工具 javassist-3.21.0-GA开发工具 javassist-3.21.0-GA开发工具 javassist-3.21.0-GA开发工具 javassist-3.21.0-GA开发...

    javassist-3.23.1-GA-API文档-中英对照版.zip

    赠送jar包:javassist-3.23.1-GA.jar; 赠送原API文档:javassist-3.23.1-GA-javadoc.jar; 赠送源代码:javassist-3.23.1-GA-sources.jar; 赠送Maven依赖信息文件:javassist-3.23.1-GA.pom; 包含翻译后的API文档...

    javassist-3.19.0-GA-API文档-中文版.zip

    赠送jar包:javassist-3.19.0-GA.jar; 赠送原API文档:javassist-3.19.0-GA-javadoc.jar; 赠送源代码:javassist-3.19.0-GA-sources.jar; 赠送Maven依赖信息文件:javassist-3.19.0-GA.pom; 包含翻译后的API文档...

    javassist-3.27.0-GA-API文档-中英对照版.zip

    赠送jar包:javassist-3.27.0-GA.jar; 赠送原API文档:javassist-3.27.0-GA-javadoc.jar; 赠送源代码:javassist-3.27.0-GA-sources.jar; 赠送Maven依赖信息文件:javassist-3.27.0-GA.pom; 包含翻译后的API文档...

    javassist-3.24.0-GA-API文档-中文版.zip

    赠送jar包:javassist-3.24.0-GA.jar; 赠送原API文档:javassist-3.24.0-GA-javadoc.jar; 赠送源代码:javassist-3.24.0-GA-sources.jar; 赠送Maven依赖信息文件:javassist-3.24.0-GA.pom; 包含翻译后的API文档...

    javassist-3.14.0-GA

    Javassist是一个开源的分析、编辑和创建Java字节码的类库。是由东京工业大学的数学和计算机科学系的 Shigeru Chiba (千叶 滋)所创建的。它已加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作...

    javassist-3.24.0-GA-API文档-中英对照版.zip

    赠送jar包:javassist-3.24.0-GA.jar; 赠送原API文档:javassist-3.24.0-GA-javadoc.jar; 赠送源代码:javassist-3.24.0-GA-sources.jar; 赠送Maven依赖信息文件:javassist-3.24.0-GA.pom; 包含翻译后的API文档...

    javassist包

    javassist包

    javassist-3.21.0-GA-API文档-中文版.zip

    赠送jar包:javassist-3.21.0-GA.jar; 赠送原API文档:javassist-3.21.0-GA-javadoc.jar; 赠送源代码:javassist-3.21.0-GA-sources.jar; 赠送Maven依赖信息文件:javassist-3.21.0-GA.pom; 包含翻译后的API文档...

    javassist-3.15.0-GA

    javassist版本 javassist-3.15.0-GA

    javassist.jar源码

    javassist-3.7.ga.jar反射类javassist.jar源码

    javassistDemo.zip

    javassist的使用,也可直接使用该demo修改自己的jar中的方法,demo中写了两种方法可供参考

    javassist-3.20.0-GA-API文档-中文版.zip

    赠送jar包:javassist-3.20.0-GA.jar; 赠送原API文档:javassist-3.20.0-GA-javadoc.jar; 赠送源代码:javassist-3.20.0-GA-sources.jar; 包含翻译后的API文档:javassist-3.20.0-GA-javadoc-API文档-中文...

    javassist-3.11.0.GA.jar

    javassist-3.11.0

    javassist-3.18.1-GA-API文档-中英对照版.zip

    赠送jar包:javassist-3.18.1-GA.jar; 赠送原API文档:javassist-3.18.1-GA-javadoc.jar; 赠送源代码:javassist-3.18.1-GA-sources.jar; 赠送Maven依赖信息文件:javassist-3.18.1-GA.pom; 包含翻译后的API文档...

    javassist-3.27.0-GA.jar

    javassist-3.27.0-GA.jar

    javaagent+javassist

    环境JDK1.8 IDEA项目 javaagent+javassist 下载后导入即可

    javassist-3.18.1-GA-API文档-中文版.zip

    赠送jar包:javassist-3.18.1-GA.jar; 赠送原API文档:javassist-3.18.1-GA-javadoc.jar; 赠送源代码:javassist-3.18.1-GA-sources.jar; 赠送Maven依赖信息文件:javassist-3.18.1-GA.pom; 包含翻译后的API文档...

Global site tag (gtag.js) - Google Analytics