`
反求诸己
  • 浏览: 534816 次
  • 性别: Icon_minigender_1
  • 来自: 湖南娄底
社区版块
存档分类
最新评论

javassist:增强型的java反射工具,获取方法参数名,获取方法参数标注值

阅读更多

java的反射是不能获取方法的参数名的。比如:

public  String concatString(String param1 ,String param2 ){
        
return  param1 + param2;
    }


想获取"param1",和"param2"这个参数名,貌似是不行的。借助第三方包javaassist 就可以获得。

 1       public   static   void  main(String[] args) {
 2          Class clazz  =  
 3  MyClass. class ;
 4           try  {
 5              ClassPool pool  =  ClassPool.getDefault();  
 6              CtClass cc  =  pool.get(clazz.getName());  
 7              CtMethod cm  =  cc.getDeclaredMethod( "concatString " );
 8              
 9               // 使用javaassist的反射方法获取方法的参数名
10              MethodInfo methodInfo  =  cm.getMethodInfo();  
11              CodeAttribute codeAttribute  =  methodInfo.getCodeAttribute();  
12              LocalVariableAttribute attr  =  (LocalVariableAttribute) codeAttribute.getAttribute(LocalVariableAttribute.tag);  
13               if  (attr  ==   null )  {
14                   // exception
15              }
16              String[] paramNames  =   new  String[cm.getParameterTypes().length];  
17               int  pos  =  Modifier.isStatic(cm.getModifiers())  ?   0  :  1 ;  
18               for  ( int  i  =   0 ; i  <  paramNames.length; i ++ )  
19                  paramNames[i]  =  attr.variableName(i  +  pos);      
20               // paramNames即参数名
21               for  ( int  i  =   0 ; i  <  paramNames.length; i ++ ) {
22                  System.out.println(paramNames[i]);
23              }
24              
25          }  catch  (NotFoundException e) {
26              e.printStackTrace();
27          } 
28      }



第一次使用觉得这个东西蛮神奇的。今天我在用反射获取标注值时,发现使用jdk本身的反射貌似也获取不到。我又想到了javassist,他果然没让我失望。

 1       public  String datefomat(@DateFormat( " yyyy-MM-dd HH " )Date date1){
 2           return  date1.toString();
 3      }
 4      
 5       public   static   void  main(String[] args) {
 6          Class clazz  = MyClass. class ;
 7           try  {
 8               // 使用jdk原生的反射方法
 9              Method m  =  clazz.getDeclaredMethod( " datefomat " new  Class[]{Date. class });
10              Annotation[][] annotations  =  m.getParameterAnnotations();
11              System.out.println(annotations[ 0 ]);
12  //             Annotation anno = annotations[0][0];  //  index outof range  exception
13          }  catch  (SecurityException e) {
14              e.printStackTrace();
15          }  catch  (NoSuchMethodException e) {
16              e.printStackTrace();
17          }
18          
19           try  {
20              ClassPool pool  =  ClassPool.getDefault();  
21              CtClass cc  =  pool.get(clazz.getName());  
22              CtMethod cm  =  cc.getDeclaredMethod( " datefomat " );
23              
24               // 使用javassist的反射方法可以获得参数标注值
25              Object[][] annotations  =  cm.getParameterAnnotations();
26              DateFormat myAnno  = (DateFormat) annotations[ 0 ][ 0 ];
27              System.out.println(myAnno.value());
28              
29              
30              
31              
32          }  catch  (NotFoundException e) {
33              e.printStackTrace();
34          }  catch  (ClassNotFoundException e) {
35              e.printStackTrace();
36          }
37          
38          
39          
40      }


Annotation的定义:

 1  package  ;
 2  
 3  import  java.lang.annotation.ElementType;
 4  import  java.lang.annotation.Target;
 5  
 6  @Target(ElementType.PARAMETER)   
 7  public  @ interface  DateFormat {
 8      String value()  default   " yyyy-MM-dd " ;
 9  }
10
我估计:
getParameterAnnotations之所以没有获得到DateFormat 的实例,是因为DateFormat 的定义没有:
@Retention(RetentionPolicy.RUNTIME)
所以运行时不会获取Annotation对象
分享到:
评论

相关推荐

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

    Maven坐标:org.javassist:javassist:3.23.1-GA; 标签:javassist、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和...

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

    Maven坐标:org.javassist:javassist:3.24.0-GA; 标签:javassist、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构...

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

    Maven坐标:org.javassist:javassist:3.21.0-GA; 标签:javassist、jar包、java、中文文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构...

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

    Maven坐标:org.javassist:javassist:3.27.0-GA; 标签:javassist、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和...

    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.27.0-GA.jar

    javassist-3.27.0-GA.jar

    javassist-3.12.1.GA.jar

    开源的分析、编辑和创建Java字节码的类库,加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作为JBoss实现动态AOP框架。

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

    Maven坐标:org.javassist:javassist:3.19.0-GA; 标签:javassist、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构...

    javassist:Java字节码工程工具包

    Java字节码工程工具包 千叶茂(Shigeru Chiba)版权所有(C)1999-2020,保留所有权利。 Javassist(JAVA编程ASSISTant)使Java字节码操作变得简单。 它是一个用Java编辑字节码的类库。 它使Java程序可以在运行时...

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

    Maven坐标:org.javassist:javassist:3.23.1-GA; 标签:javassist、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构...

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

    Maven坐标:org.javassist:javassist:3.18.1-GA; 标签:javassist、jar包、java、中文文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构...

    开发工具 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.24.0-GA-API文档-中英对照版.zip

    Maven坐标:org.javassist:javassist:3.24.0-GA; 标签:javassist、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和...

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

    Maven坐标:org.javassist:javassist:3.18.1-GA; 标签:javassist、jar包、java、API文档、中英对照版; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中...

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

    Maven坐标:org.javassist:javassist:3.21.0-GA; 标签:javassist、jar包、java、中英对照文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和...

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

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

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

    Maven坐标:org.javassist:javassist:3.19.0-GA; 标签:javassist、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和...

    javassist反射类

    java反射的工具类,可以获得方法的参数名称

    javassist反射工具

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

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

    javassist, Java字节码工程工具包 Java字节码工程工具包 版本 3版权所有( C ) 1999 -2017按 Shigeru Chiba,保留所有权利。Javassist ( Java编程助手) 使Java字节码操作简单。 它是一个类库,用于在Java中编辑字节码

Global site tag (gtag.js) - Google Analytics