`
xiangxingchina
  • 浏览: 520115 次
  • 性别: 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 官方手册中文版 Javassist 是一个动态生成字节码的框架,生成的字节码可以输出或实时加载到 JVM 中。...通过学习和掌握 Javassist,可以使开发者更好地控制和操作 Java 字节码,提高开发效率和质量。

    Javassist学习手册

    ### Javassist学习手册知识点详解 #### 一、引言 Javassist 是一款功能强大的 Java 字节码操作工具库,它可以动态地修改类结构、方法体等,从而实现类的增强、代理等功能。这对于框架开发、AOP、动态代理等领域...

    javaagent+javassist

    1. 创建一个`javaagent`,定义一个`premain`方法,该方法会在JVM启动时被调用: ```java public class MyAgent { public static void premain(String agentArgs, Instrumentation inst) { inst.addTransformer...

    javassist+jd-gui

    4. **类转换**:`javassist` 提供了转换器,可以将类从一种形式转换为另一种形式,例如从 Java 源码转换为字节码。 另一方面,`jd-gui` 是一个独立的图形化工具,用于反编译 Java 字节码为源代码。在开发过程中,...

    java 反编译工具 jboss-javassist

    2. **学习API**:熟悉Javassist提供的各种类和方法,如`ClassPool`、` CtClass`、`CtMethod`等,这些都是操作字节码的核心类。 3. **创建或修改类**:通过`ClassPool`获取或创建类对象,然后利用`CtClass`的方法来...

    Javassist18版20版22版的jar包

    1. **Javassist的核心功能**: - 类的动态修改:Javassist提供了一种简单的方式来修改类的方法、字段,甚至可以在运行时添加新的方法或字段。 - 字节码操作:它允许用户通过CtClass接口来操作字节码,CtClass对象...

    javassist-3.18.1-GA.jar

    `javassist-3.18.1-GA.jar`是Javaassist的一个特定版本,GA代表“General Availability”,意味着这是一个正式发布的稳定版本。这个版本号`3.18.1`表明它是对之前版本的改进和增强,修复了已知问题并可能引入了一些...

    javassistDemo

    "javassistDemo"很可能是某个开发者为了展示或者学习Javaassist功能而创建的一个示例项目。 在Javaassist中,主要涉及以下几个关键知识点: 1. **类转换**:Javaassist提供了一个名为`ClassPool`的类,它是整个...

    javassist-3.18.0-GA

    "javassist-3.18.0-GA" 是 Javaassist 的一个特定版本,发布于GA(General Availability),意味着这个版本是稳定且可供广泛使用的。 1. **Javaassist 库的基本概念**: Javaassist 提供了一种简单的API,可以用来...

    javassist-3.15.0-GA

    Javaassist 是一个强大的 Java 字节码操作库,...这个版本 "javassist-3.15.0-GA" 包含了完整的源码和文档,对于学习和使用都非常方便。如果你是 Java 开发者,特别是对字节码操作感兴趣的话,这个库绝对值得深入研究。

    javassist-3.18.0-ga

    1. **字节码操作**:Javaassist提供了一系列API,可以方便地对Java字节码进行操作,如添加、修改、删除方法或字段。这对于实现AOP(面向切面编程)或动态代理等高级功能非常有帮助。 2. **类转换**:通过`ClassPool...

    javassist.jar源码

    1. **字节码操作**:Javaassist提供了一种简单的方法来操作字节码,通过` CtClass `、` CtMethod `和` CtField `等类,可以方便地创建、修改和分析类、方法和字段。例如,你可以使用它来动态添加或修改类的方法,...

    javassist3.9GA

    这个"javassist3.9GA"版本是Javaassist的一个发行版本,主要目的是清理从字节码类文件中测试代码。这个过程对于构建可维护和高效的软件系统尤其重要,因为测试代码通常会在生产环境中增加不必要的负担。 Javaassist...

    javassist18,20,22三个版本.zip

    - **javassist-3.18.0-ga**:这是较早的一个版本,可能包含了基本的功能,如类的加载、修改和保存。此版本可能对某些特定JVM版本有良好的兼容性,但可能缺少后来版本中的一些优化和新特性。 - **javassist-3.20.0-...

    javassist-3.11

    1. **字节码操作**:Javassist通过提供CtClass接口,允许开发者以文本或字节码形式修改类和方法。CtClass提供了诸如添加字段、方法,修改方法体,甚至创建新类等一系列功能。例如,你可以使用`CtClass.makeClass()`...

    javassist使用手册

    1. **类的动态修改**: Javaassist允许开发者在程序运行过程中动态修改类的结构。你可以添加、删除或修改方法和字段,甚至可以改变类的继承关系。这对于实现AOP(面向切面编程)或者在不修改源代码的情况下增强已有...

    javassist试图简化Java字节码的编辑

    1. ** CtClass **:这是`javassist`的核心类,代表一个类的字节码表示。你可以通过`CtClass`来获取类的信息,如类名、方法、字段等,并进行修改。例如,你可以添加新的方法,修改现有方法的字节码,或者插入新的字段...

    javassist,Java字节码工程工具包.zip

    1. **字节码生成**:Javassist能够生成新的类或方法的字节码,这对于实现动态类型或者运行时代码生成非常有用。它提供了一种类似于Java语法的API来创建和编辑类,使得生成字节码的过程更加直观和易于理解。 2. **类...

    javassist-rel_3_23_1_ga

    这个“javassist-rel_3_23_1_ga”压缩包包含的是Javaassist的一个特定版本,即3.23.1-GA。对于Java开发者,尤其是那些对动态编程或元编程感兴趣的开发者来说,Javaassist是一个非常有价值的工具。 Javaassist允许...

Global site tag (gtag.js) - Google Analytics