<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    我是FE,也是Fe

    前端來源于不斷的點滴積累。我一直在努力。

    統計

    留言簿(15)

    閱讀排行榜

    評論排行榜

    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 


    問題是解決了。回頭想想,不知道為什么jdk提供的getParameterAnnotations方法就不行(bug? I do not know) 我的jdk版本是1.5.0_17-b04。

    posted on 2010-10-25 17:53 衡鋒 閱讀(8259) 評論(10)  編輯  收藏 所屬分類: j2ee

    評論

    # re: javassist:增強型的java反射工具,獲取方法參數名,獲取方法參數標注值 2010-11-13 19:19 陽衡鋒

    getParameterAnnotations之所以沒有獲得到DateFormat 的實例,是因為DateFormat 的定義沒有:
    @Retention(RetentionPolicy.RUNTIME)
    所以運行時不會獲取Annotation對象

      回復  更多評論   

    # re: javassist:增強型的java反射工具,獲取方法參數名,獲取方法參數標注值 2011-09-15 08:31 tb

    貌似很強大啊   回復  更多評論   

    # re: javassist:增強型的java反射工具,獲取方法參數名,獲取方法參數標注值[未登錄] 2012-06-21 11:54 java

    補充一點,這種獲取參數名的方法,需要在編譯時指定vars,即在編譯時將變量名稱信息附加到字節碼中,否則javassist也無能為力  回復  更多評論   

    # re: javassist:增強型的java反射工具,獲取方法參數名,獲取方法參數標注值 2012-07-06 16:56 tfzzh

    勉強的用 自建注解的方式處理了該問題  回復  更多評論   

    # re: javassist:增強型的java反射工具,獲取方法參數名,獲取方法參數標注值 2013-01-20 00:10 Unmi

    確實是很有用,記得原來曾經思考過一個根據參數名來確定執行邏輯的實現,但是反射,包括一些 Aspect 實現攔截時也做不到,所以未能達成,下回看有這個需求的時候,可以考慮用下 javaassit。  回復  更多評論   

    # re: javassist:增強型的java反射工具,獲取方法參數名,獲取方法參數標注值 2013-06-04 16:12 tb

    貌似方法不錯的  回復  更多評論   

    # re: javassist:增強型的java反射工具,獲取方法參數名,獲取方法參數標注值[未登錄] 2014-02-26 11:31 wind

    使用Spring的:
    LocalVariableTableParameterNameDiscoverer variableDiscover = new LocalVariableTableParameterNameDiscoverer();
    String[] params = variableDiscover.getParameterNames(declaredMethod);  回復  更多評論   

    # re: javassist:增強型的java反射工具,獲取方法參數名,獲取方法參數標注值[未登錄] 2014-09-16 15:06 xx

    getParameterAnnotations方法 只能獲取運行時的Annotations ,在你自己的Annotations上加上@Retention(RetentionPolicy.RUNTIME)應該就能獲取了  回復  更多評論   

    # re: javassist:增強型的java反射工具,獲取方法參數名,獲取方法參數標注值 2014-12-10 17:00 foru

    CodeAttribute codeAttribute = methodInfo.getCodeAttribute();
    我在這一步,codeAttribute就是null了,這個是什么原因啊?  回復  更多評論   

    # re: javassist:增強型的java反射工具,獲取方法參數名,獲取方法參數標注值 2014-12-17 10:15 唐思

    因為你的注解Dateformat類沒有加上@Retention(RetentionPolicy.RUNTIME)

    這個就是說在運行時保證可以獲取到該注解信息,
    你現在的做法放射肯定得不到啊  回復  更多評論   

    主站蜘蛛池模板: 精品免费国产一区二区| 亚洲一卡2卡三卡4卡无卡下载| 妞干网在线免费视频| 中文字幕免费观看视频| 亚洲av中文无码乱人伦在线观看| 综合自拍亚洲综合图不卡区| 亚洲性日韩精品一区二区三区| 在线观看永久免费视频网站| av无码免费一区二区三区| 9久热精品免费观看视频| 国产大陆亚洲精品国产| 亚洲乱色熟女一区二区三区蜜臀| 久久久亚洲欧洲日产国码是AV| 亚洲狠狠婷婷综合久久久久| 亚洲午夜激情视频| 四虎影永久在线高清免费| 性盈盈影院免费视频观看在线一区| 中文字幕在线免费观看| 亚洲午夜免费视频| 精品四虎免费观看国产高清午夜| 国产精品美女免费视频观看| 九九免费观看全部免费视频| 黄色一级毛片免费| 免费看内射乌克兰女| 国产成人亚洲综合a∨| 国产精品亚洲va在线观看| 无码天堂亚洲国产AV| 色噜噜的亚洲男人的天堂| 国产精品亚洲色婷婷99久久精品| 亚洲av无码成人影院一区 | 男人的天堂网免费网站| 成人网站免费大全日韩国产| 两个人的视频www免费| a国产成人免费视频| 人人揉揉香蕉大免费不卡| 久久国产免费一区二区三区| 无码日韩精品一区二区免费暖暖 | 免费一级一片一毛片| 免费**毛片在线播放直播| yy6080亚洲一级理论| 中文字幕精品亚洲无线码二区|