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

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

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

    隨筆 - 81  文章 - 1033  trackbacks - 0
    <2007年1月>
    31123456
    78910111213
    14151617181920
    21222324252627
    28293031123
    45678910

    在浮躁的年代里,我們進(jìn)取心太切,患得患失;虛榮心太強(qiáng),戰(zhàn)戰(zhàn)兢兢。一心爭(zhēng)強(qiáng)好勝,惟恐榜上無(wú)名。
    I think I can fly , and flying like a bird !
    程序員一名,已售出,缺貨中!

    我的郵件聯(lián)系方式

    用且僅用于MSN

    博客點(diǎn)擊率
    free web counter
    free web counter

    常用鏈接

    留言簿(36)

    隨筆檔案

    搜索

    •  

    積分與排名

    • 積分 - 186995
    • 排名 - 309

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    在創(chuàng)建EJB組件時(shí),必需提供一些定義,使得EJB組件使用一些服務(wù)例如:安全服務(wù),持久化服務(wù),事務(wù)服務(wù)。EJB容器可以提供這些服務(wù),這樣EJB只要實(shí)現(xiàn)業(yè)務(wù)邏輯就可以了。但是說(shuō)到底EJB容器使用EJB組件的元數(shù)據(jù)來(lái)提供這些服務(wù),在以前EJB的元數(shù)據(jù)是以XML配置文件形式出現(xiàn)的,這些配置文件與EJB源文件是分開(kāi)的。
    EJB的部署人員無(wú)法了解EJB本身的信息,如果EJB組件的創(chuàng)建者用注釋(Annotation)的方法將這些配置服務(wù)的信息和代碼放在一起,這樣EJB的部署者就可以了解EJB的信息,EJB的home接口可以使用Annotation自動(dòng)生成,當(dāng)然到目前為止更好的是在簡(jiǎn)單的Java Object上使用Annotations。

    一 什么是Annotation

    在已經(jīng)發(fā)布的JDK1.5(tiger)中增加新的特色叫 Annotation。Annotation提供一種機(jī)制,將程序的元素如:類,方法,屬性,參數(shù),本地變量,包和元數(shù)據(jù)聯(lián)系起來(lái)。這樣編譯器可以將元數(shù)據(jù)存儲(chǔ)在Class文件中。這樣虛擬機(jī)和其它對(duì)象可以根據(jù)這些元數(shù)據(jù)來(lái)決定如何使用這些程序元素或改變它們的行為。

    二 定義一個(gè)簡(jiǎn)單的Annotation并使用它

    1.定義Annotation

    定義一個(gè)Annotation是什么簡(jiǎn)單的,它采取的是類似于Interface的定義方式: “@+annotation類型名稱+(..逗號(hào)分割的name-value對(duì)...)”

    代碼
    1. //Example?1 ??
    2. ??
    3. package ?sz.starbex.bill.annotation; ??
    4. ??
    5. import ?java.lang.annotation.Retention; ??
    6. ??
    7. import ?java.lang.annotation.RetentionPolicy; ??
    8. ??
    9. import ?java.lang.annotation.Target; ??
    10. ??
    11. import ?java.lang.annotation.ElementType; ??
    12. ??
    13. @Retention (RetentionPolicy.RUNTIME) ??
    14. ??
    15. @Target (ElementType.METHOD) ??
    16. ??
    17. public ? @interface ?SimpleAnnotation?{ ??
    18. ??
    19. String?value(); ??
    20. ??
    21. }??

    @Retention這個(gè)meta-annotation表示我們創(chuàng)建的SimpleAnnotation這個(gè)Annotation將會(huì)存儲(chǔ)在Class文件中,并在java

    VM運(yùn)行時(shí)加載它。@Target這個(gè)meta-annotation表示我們創(chuàng)建的SimplwAnnotation將會(huì)為描述方法,而@interface SimpleAnnotation是我們自定義的Annotation,它有一個(gè)成員叫value,返回值是String。

    2.使用Annotation

    代碼
    1. //Example?2 ??
    2. ??
    3. package ?sz.starbex.bill.annotation; ??
    4. ??
    5. import ?sz.starbex.bill.annotation.SimpleAnnotation; ??
    6. ??
    7. public ? class ?UsingSimpleAnnotation?{ ??
    8. ??
    9. @SimpleAnnotation (value= "Pass:This?method?will?Pass" ) //注意name=value的用法 ??
    10. ??
    11. public ? void ?pass(){ ??
    12. ??
    13. if ( 10 > 5 )?System.out.println( "測(cè)試通過(guò)" ); ??
    14. ??
    15. } ??
    16. ??
    17. @SimpleAnnotation ( "Fail:This?method?will?Fail" ) //注意name=value的用法 ??
    18. ??
    19. public ? void ?fail(){ ??
    20. ??
    21. if ( 10 < 5 )?System.out.println( "測(cè)試失敗" ); ??
    22. ??
    23. } ??
    24. ??
    25. }??

    一個(gè)Annotation用于程序元素(在本例中是method),在method方法之前用(@Annotation名稱(name=value,name=value.....)。在本例中是@SimpleAnnotation(value="Pass:This method will Pass")。每個(gè)annotation具有一個(gè)名字和成員個(gè)數(shù)>=0,當(dāng)只有一個(gè)單一的成員時(shí),這個(gè)成員就是value。我們也可以這樣寫(xiě) @SimpleAnnotation("Fail:This method will Fail")。至此@SimpleAnnotation將Pass和Fail聯(lián)系起來(lái)了。

    3.在運(yùn)行時(shí)訪問(wèn)Annotation

    一旦Annotation與程序元素聯(lián)系起來(lái),我們可以通過(guò)反射訪問(wèn)它們并可以取得它們的值。我們使用一個(gè)新的interface:java.lang.reflect.AnnotatedElement。java.lang.reflect.AnnotatedElement接口中的方法有:

    a. boolean isAnnotationPresent(Class annotationType)

    如果指定類型的注釋存在于此元素上,則返回 true,否則返回 false。
    b. T getAnnotation(Class annotationType)

    如果存在該元素的指定類型的注釋,則返回這些注釋,否則返回 null。
    c. Annotation[] getAnnotations()

    返回此元素上存在的所有注釋。
    d. Annotation[] getDeclaredAnnotations()

    返回直接存在于此元素上的所有注釋。
    你要注意 isAnnotationPresent和getAnnotation方法,它們使用了Generics,請(qǐng)參考我的Java 范型的Blog。

    下面我們列出一些實(shí)現(xiàn)了AnnotatedElement 接口的類

    1. java.lang.reflect.AccessibleObject

    2. java.lang.Class

    3. java.lang.reflect.Constructor

    4. java.lang.reflect.Field

    5. java.lang.reflect.Method

    6. java.lang.Package

    下面的Example程序說(shuō)明了如何在運(yùn)行環(huán)境訪問(wèn)Annotation

    代碼
    1. package ?sz.starbex.bill.annotation; ??
    2. ??
    3. import ?sz.starbex.bill.annotation.SimpleAnnotation; ??
    4. ??
    5. import ?java.lang.reflect.Method; ??
    6. ??
    7. public ? class ?SimpleAccessAnnotation?{ ??
    8. ??
    9. static ? void ?accessAnnotationTest(Class?usingAnnnotationClass){ ??
    10. ??
    11. try ?{ ??
    12. ??
    13. //Object?usingAnnnotationClass=Class.forName(usingAnnotationClassName).newInstance(); ??
    14. ??
    15. Method?[]?methods=usingAnnnotationClass.getDeclaredMethods(); //取得對(duì)方法 ??
    16. ??
    17. for (Method?method:methods){ ??
    18. ??
    19. System.out.println(method.getName()); ??
    20. ??
    21. SimpleAnnotation? ??
    22. ??
    23. simpleAnnotation=method.getAnnotation(SimpleAnnotation. class ); //得到方法的Annotation ??
    24. ??
    25. if (simpleAnnotation!= null ){ ??
    26. ??
    27. System.out.print(simpleAnnotation.value()+ "==" ); ??
    28. ??
    29. String?result=invoke(method,usingAnnnotationClass); ??
    30. ??
    31. System.out.println(result); ??
    32. ??
    33. } ??
    34. ??
    35. } ??
    36. ??
    37. }? catch ?(Exception?e)?{ ??
    38. ??
    39. //?TODO?Auto-generated?catch?block ??
    40. ??
    41. e.printStackTrace(); ??
    42. ??
    43. } ??
    44. ??
    45. } ??
    46. ??
    47. static ?String?invoke(Method?m,?Object?o)?{ ??
    48. ??
    49. String?result?=? "passed" ; ??
    50. ??
    51. try ?{ ??
    52. ??
    53. m.invoke(m, new ?Object[]{}); ??
    54. ??
    55. }? catch ?(Exception?e)?{ ??
    56. ??
    57. //?TODO?Auto-generated?catch?block ??
    58. ??
    59. result?=? "failed" ; ??
    60. ??
    61. } ??
    62. ??
    63. return ?result; ??
    64. ??
    65. } ??
    66. ??
    67. /** ?
    68. *?@param?args ?
    69. */ ??
    70. ??
    71. public ? static ? void ?main(String[]?args)?{ ??
    72. ??
    73. //?TODO?Auto-generated?method?stub ??
    74. ??
    75. accessAnnotationTest(UsingSimpleAnnotation. class ); ??
    76. ??
    77. } ??
    78. ??
    79. }??

    Java 中的Annotation的定義

    Java中的Annotation

    Java定義了幾個(gè)標(biāo)準(zhǔn)的meta-annotation,在新Package中java.lang.annotation 中包含了以下meta-annotation:

    meta-annotation 說(shuō)明

    @Target

    1. annotation的target是一個(gè)被標(biāo)注的程序元素。target說(shuō)明了annotation所修飾的對(duì)象范圍:annotation可被用于packages、types(類、接口、枚舉、annotation類型)、類型成員(方法、構(gòu)造方法、成員變量、枚舉值)、方法參數(shù)和本地變量(如循環(huán)變量、catch參數(shù))。在annotation類型的聲明中使用了target可更加明晰其修飾的目標(biāo)。

    meta-annotation 說(shuō)明
    @Target 1. annotation的target是一個(gè)被標(biāo)注的程序元素。target說(shuō)明了annotation所修飾的對(duì)象范圍:annotation可被用于packages、types(類、接口、枚舉、annotation類型)、類型成員(方法、構(gòu)造方法、成員變量、枚舉值)、方法參數(shù)和本地變量(如循環(huán)變量、catch參數(shù))。在annotation類型的聲明中使用了target可更加明晰其修飾的目標(biāo)。

    2. ElementType的定義

    TYPE// Class, interface, or enum (but not annotation)
    FIELD// Field (including enumerated values)

    METHOD// Method (does not include constructors)

    PARAMETER// Method parameter

    CONSTRUCTOR// Constructor

    LOCAL_VARIABLE// Local variable or catch clause

    ANNOTATION_TYPE// Annotation Types (meta-annotations)

    PACKAGE// Java package
    @Retention

    1. SOURCE//按照規(guī)定使用注釋,但是并不將它保留到編譯后的類文件中

    2. CLASS//將注釋保留在編譯后的類文件中,但是在運(yùn)行時(shí)忽略它

    3. RUNTIME//將注釋保留在編譯后的類文件中,并在第一次加載類時(shí)讀取它

    @Documented Documented 表示注釋?xiě)?yīng)該出現(xiàn)在類的 Javadoc 中

    @Inherited 一個(gè)Annotation將被繼承

    三個(gè)標(biāo)準(zhǔn)的Annotation 在java.lang包中:

    @Deprecated 對(duì)不再使用的方法進(jìn)行注釋
    @Override 指明注釋的方法覆蓋超類的方法
    @SuppressWarnings 阻止編譯器的警告,例:當(dāng)類型不安全時(shí)

    下例來(lái)說(shuō)明這三個(gè)標(biāo)準(zhǔn)的Annotation:

    代碼
    1. package ?sz.starbex.bill.annotation; ??
    2. ??
    3. import ?java.util.ArrayList; ??
    4. ??
    5. import ?java.util.List; ??
    6. ??
    7. public ? class ?SimpleOverrideAnnotation?{ ??
    8. ??
    9. public ? static ? void ?main(String[]?args)?{ ??
    10. ??
    11. SimpleOverrideAnnotation?test?=? new ?SimpleOverrideAnnotation(); ??
    12. ??
    13. System.out.println(test.toString()); ??
    14. ??
    15. } ??
    16. ??
    17. @Override ??
    18. ??
    19. public ?String?toString()?{ ??
    20. ??
    21. return ? "自己的類自己輸出" ; ??
    22. ??
    23. } ??
    24. ??
    25. @Deprecated ??
    26. ??
    27. public ? void ?doSomething()?{ ??
    28. ??
    29. System.out.println( "方法已過(guò)時(shí)" ?); ??
    30. ??
    31. } ??
    32. ??
    33. @SuppressWarnings (value={ "unchecked" }) ??
    34. ??
    35. public ? void ?testSuppressWarnings(){ ??
    36. ??
    37. List?testList= new ?ArrayList(); ??
    38. ??
    39. testList.add( "KKKK" ); //沒(méi)有使用范型,類型不安全 ??
    40. ??
    41. } ??
    42. ??
    43. }??

    二、Annotation使用實(shí)例

    一個(gè)組合的Annotation,注釋類的

    a. 商標(biāo)Annotation

    代碼
    1. package ?sz.starbex.bill.annotation; ??
    2. ??
    3. public ? @interface ?Trademark?{ ??
    4. ??
    5. String?name(); ??
    6. ??
    7. String?owner(); ??
    8. ??
    9. }???

    b.License的annotation

    代碼
    1. package ?sz.starbex.bill.annotation; ??
    2. ??
    3. import ?java.lang.annotation.*; ??
    4. ??
    5. @Retention (RetentionPolicy.RUNTIME) ??
    6. ??
    7. @Target ({ElementType.TYPE,?ElementType.PACKAGE}) ??
    8. ??
    9. public ? @interface ?License?{ ??
    10. ??
    11. String?name(); ??
    12. ??
    13. String?notice(); ??
    14. ??
    15. boolean ?redistributable(); ??
    16. ??
    17. Trademark[]?trademarks(); ??
    18. ??
    19. }???

    c.測(cè)試類

    代碼
    1. package ?sz.starbex.bill.annotation; ??
    2. ??
    3. @License (name= "Bill" , ??
    4. ??
    5. notice= "許可證" , ??
    6. ??
    7. redistributable= true , ??
    8. ??
    9. trademarks={ @Trademark (name= "Mercedes" ,owner= "Swedish" ), ??
    10. ??
    11. @Trademark (name= "Daewoo" ,owner= "Korean" ) ??
    12. ??
    13. }? ??
    14. ??
    15. ) ??
    16. ??
    17. public ? class ?TestLicenseAnnotation?{ ??
    18. ??
    19. public ? static ? void ?main(String[]?args)?{ ??
    20. ??
    21. TestLicenseAnnotation?test= new ?TestLicenseAnnotation(); ??
    22. ??
    23. License?license=test.getClass().getAnnotation(License. class ); ??
    24. ??
    25. System.out.println( "License發(fā)放人:" +license.name()); ??
    26. ??
    27. System.out.println( "License注意事項(xiàng):" +license.notice()); ??
    28. ??
    29. System.out.println( "License許可:" +license.redistributable()); ??
    30. ??
    31. Trademark?[]?marks=license.trademarks(); ??
    32. ??
    33. for (Trademark?mark:marks){ ??
    34. ??
    35. System.out.println( "商標(biāo)名稱:" +mark.name()); ??
    36. ??
    37. System.out.println( "商標(biāo)的使用者:" +mark.owner()); ??
    38. ??
    39. } ??
    40. ??
    41. } ??
    42. ??
    43. }? ??
    44. ??

    from:http://java.chinaitlab.com/EJB/519586_2.html



    posted on 2007-01-22 22:26 cresposhi 閱讀(995) 評(píng)論(6)  編輯  收藏

    FeedBack:
    # re: 什么是Annotation?【轉(zhuǎn)載】 2007-02-01 14:39 梅穎
    轉(zhuǎn)的也坐哈沙發(fā),呵呵  回復(fù)  更多評(píng)論
      
    # re: 什么是Annotation?【轉(zhuǎn)載】 2007-02-01 14:57 施偉
    呵呵,看來(lái)你無(wú)處不在列!  回復(fù)  更多評(píng)論
      
    # re: 什么是Annotation?【轉(zhuǎn)載】 2007-02-01 16:21 梅穎
    嗚嗚。。  回復(fù)  更多評(píng)論
      
    # re: 什么是Annotation?【轉(zhuǎn)載】 2007-02-01 21:46 施偉
    哭什么啊,誰(shuí)欺負(fù)你了啊?  回復(fù)  更多評(píng)論
      
    # re: 什么是Annotation?【轉(zhuǎn)載】 2007-02-02 15:14 梅穎
    同事。。。  回復(fù)  更多評(píng)論
      
    # re: 什么是Annotation?【轉(zhuǎn)載】 2007-02-02 20:41 施偉
    好,我等會(huì)幫你檄文討伐  回復(fù)  更多評(píng)論
      

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 国产A∨免费精品视频| 国产精品亚洲а∨天堂2021| 免费乱码中文字幕网站| 67194国产精品免费观看| 波霸在线精品视频免费观看| 亚洲国产精品成人AV在线| 亚洲大片在线观看| 午夜爽爽爽男女免费观看影院| 亚洲美女一区二区三区| 国产一卡2卡3卡4卡2021免费观看 国产一卡2卡3卡4卡无卡免费视频 | 亚洲视屏在线观看| 国产亚洲日韩在线三区| 国产免费牲交视频| 日韩免费毛片视频| 最近免费中文字幕4| 免费v片在线观看视频网站| 免费视频精品一区二区三区 | 亚洲人成网站18禁止一区| 国产真实伦在线视频免费观看| 香蕉97超级碰碰碰免费公| 91精品免费高清在线| 久久青青草原国产精品免费| 好湿好大好紧好爽免费视频| 免费无码国产V片在线观看| 亚洲中文字幕久久久一区| 亚洲中文无码线在线观看| 亚洲精品人成电影网| 亚洲高清美女一区二区三区| 亚洲综合一区二区国产精品| 亚洲国产国产综合一区首页| 亚洲s色大片在线观看| 五月天网站亚洲小说| 亚洲AV成人片色在线观看| 亚洲av网址在线观看| 久久亚洲国产精品五月天| 亚洲国产精品久久久久久| 亚洲麻豆精品果冻传媒| 亚洲av产在线精品亚洲第一站| 亚洲欧洲日韩极速播放| 亚洲成a人片77777老司机| 亚洲精品成人av在线|