Java 注解學習筆記

轉自:http://wanqiufeng.blog.51cto.com/409430/458883

一、什么是java注解

注解,顧名思義,注解,就是對某一事物進行添加注釋說明,會存放一些信息,這些信息可能對以后某個時段來說是很有用處的。 Java注解又叫java標注,java提供了一套機制,使得我們可以對方法、類、參數、包、域以及變量等添加標準(即附上某些信息)。且在以后某個時段通過反射將標注的信息提取出來以供使用。二、自定義Java標注

1 為什么要自定義注解

  Java從1.5版本以后默認內置三個標注:

  1. @Override:只能用在方法之上的,用來告訴別人這一個方法是改寫父類的。
  2. @Deprecated:建議別人不要使用舊的API的時候用的,編譯的時候會用產生警告信息,可以設定在程序里的所有的元素上.
  3. @SuppressWarnings:這一個類型可以來暫時把一些警告信息消息關閉.

  但是,僅僅這三個標注是不能滿足我們開發時一些需求的。所以java允許我們自定義注解來使用。

2 如何自定義注解

  自定義步驟大致分為兩步:

  1. 通過@interface關鍵字(注意,不是interface,是@interace)聲明注解名稱,以及注解的成員屬性或者叫做注解的參數。
  2. 使用java內置的四個元注解對這個自定義標注的功能和范圍進行一些限制

問題來了,什么是元注解?

3 什么是元注解

元注解,就是定義注解的注解,也就是說這些元注解是的作用就是專門用來約束其它注解的注解。

請區別上面那三個注解,他們也是通過元注解定義而來的。

元注解有哪些呢,主要有四個@Target,@Retention,@Documented,@Inherited?

 1      元注解有:@Target,@Retention,@Documented,@Inherited 2  3         @Target 表示該注解用于什么地方,可能的 ElemenetType 參數包括: 4         ElemenetType.CONSTRUCTOR 構造器聲明 5         ElemenetType.FIELD 域聲明(包括 enum 實例) 6         ElemenetType.LOCAL_VARIABLE 局部變量聲明 7         ElemenetType.METHOD 方法聲明 8         ElemenetType.PACKAGE 包聲明 9         ElemenetType.PARAMETER 參數聲明 
10         ElemenetType.TYPE 類,接口(包括注解類型)或enum聲明 
11          
12         @Retention 表示在什么級別保存該注解信息。可選的 RetentionPolicy 參數包括: 
13         RetentionPolicy.SOURCE 注解將被編譯器丟棄 
14         RetentionPolicy.CLASS 注解在class文件中可用,但會被VM丟棄 
15         RetentionPolicy.RUNTIME VM將在運行期也保留注釋,因此可以通過反射機制讀取注解的信息。 
16          
17         @Documented 將此注解包含在 javadoc 中 
18  
19         @Inherited 允許子類繼承父類中的注解 


4 自定義及使用注解示例

自定義一個類級別的標注Description

 1    package lighter.javaeye.com;
 2    import java.lang.annotation.Documented;
 3    import java.lang.annotation.ElementType;
 4    import java.lang.annotation.Retention;
 5    import java.lang.annotation.RetentionPolicy;
 6    import java.lang.annotation.Target;
 7  
 8    @Target(ElementType.TYPE)//這個標注應用于類
 9    @Retention(RetentionPolicy.RUNTIME)//標注會一直保留到運行時
10    @Documented//將此注解包含在javadoc中
11    public @interface Description {
12        String value();
13    }

再定義個方法級別的注解Name

 1 package lighter.javaeye.com;
 2    import java.lang.annotation.Documented;
 3    import java.lang.annotation.ElementType;
 4    import java.lang.annotation.Retention;
 5    import java.lang.annotation.RetentionPolicy;
 6    import java.lang.annotation.Target;
 7  
 8     //注意這里的@Target與@Description里的不同,參數成員也不同
 9    @Target(ElementType.METHOD)
10    @Retention(RetentionPolicy.RUNTIME)
11    @Documented
12    public @interface Name {
13        String originate();
14        String community();
15    }

然后使用以上兩個注解

 1 package lighter.javaeye.com;
 2  
 3 @Description(value="javaeye,做最棒的軟件開發交流社區")
 4 public class JavaEyer {
 5          @Name(originate="創始人:robbin",community="javaEye")
 6          public String getName()
 7          {
 8                    return null;
 9          }
10         
11          @Name(originate="創始人:江南白衣",community="springside")
12          public String getName2()
13          {
14                    return "借用兩位的id一用,寫這一個例子,請見諒!";
15          }
16 }
17  
18 說明:其中標注“@Description(value="javaeye,做最棒的軟件開發交流社區")”,可以寫成“@Description("javaeye,做最棒的軟件開發交流社區") ”,結果也是一樣的。
  因為Description標注定義的時候其參數(或者說屬性)為value。
  而value比較特殊,它在被指定參數的時候可以不用顯示的寫出來。
  當然如果定義的時候參數名不是value而是其它的比如des,那么使用注解的時候,必須顯示寫出參數名,然后再賦值:@Description(Des=”xxx”)*/

提取出注解的信息

 1  package lighter.javaeye.com;
 2  
 3  import java.lang.reflect.Method;
 4  import java.util.HashSet;
 5  import java.util.Set;
 6  
 7  public class TestAnnotation {
 8          /**
 9           * author lighter
10           * 說明:具體關天Annotation的API的用法請參見javaDoc文檔
11           */
12        public static void main(String[] args) throws Exception {
13        String CLASS_NAME = "lighter.javaeye.com.JavaEyer";
14        Class test = Class.forName(CLASS_NAME);
15        Method[] method = test.getMethods();
16        boolean flag = test.isAnnotationPresent(Description.class);
17         if(flag)
18         {
19                  Description des = (Description)test.getAnnotation(Description.class);
20                  System.out.println("描述:"+des.value());
21                  System.out.println("-----------------");
22         }
23        
24         //把JavaEyer這一類有利用到@Name的全部方法保存到Set中去
25         Set<Method> set = new HashSet<Method>();
26         for(int i=0;i<method.length;i++)
27         {
28                  boolean otherFlag = method[i].isAnnotationPresent(Name.class);
29                  if(otherFlag) set.add(method[i]);
30         }
31         for(Method m: set)
32         {
33                  Name name = m.getAnnotation(Name.class);
34                   System.out.println(name.originate());
35                  System.out.println("創建的社區:"+name.community());
36         }
37      }
38 }
注意事項:
所有的Annotation會自動繼承java.lang.annotation這一個接口,所以不能再去繼承別的類或是接口.
???  最重要的一點,Annotation類型里面的參數該怎么設定:
??  ?第一,只能用public或默認(default)這兩個訪問權修飾.例如,String value();這里把方法設為defaul默認類型.
??  ?第二,參數成員只能用基本類型byte,short,char,int,long,float,double,boolean八種基本數據類型和String,Enum,Class,annotations等數據類型,
以及這一些類型的數組.例如,String value();這里的參數成員就為String.
參考資料:?http://www.javaeye.com/topic/36659#
http://www.javaeye.com/topic/400085

?

轉載于:https://www.cnblogs.com/yaowukonga/archive/2013/03/28/2987002.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/378685.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/378685.shtml
英文地址,請注明出處:http://en.pswp.cn/news/378685.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Prime Palindromes

博客園速度非常不穩定&#xff0c;可能要考慮換地方了。雖然我非常喜歡博客園的模板和氣氛。 這個題早就知道是怎么做的了。先求出回文數在再判斷是不是素數。關鍵是不知道區間&#xff0c;那就把所有的全部求出來。雖然可能會超時&#xff0c;但是如果使用點技巧的話還是沒問題…

Opencv——DFT變換(實現兩個Mat的卷積以及顯示Mat的頻域圖像)

DFT原理&#xff1a;&#xff08;單變量離散傅里葉變換&#xff09; 數學基礎&#xff1a; 任何一個函數都可以轉換成無數個正弦和余弦函數的和的形式。 通常觀察傅里葉變換后的頻域函數可以獲得兩個重要的信息&#xff1a;幅頻曲線和相頻曲線。 在數字圖像處理中的作用&#…

python方法items_Python字典items()方法與示例

python方法items字典items()方法 (Dictionary items() Method) items() method is used to get the all items as a view object, the view object represents the key-value pair of the dictionary. items()方法用于獲取所有項目作為視圖對象&#xff0c;該視圖對象表示字典的…

基于(Python下的OpenCV)圖像處理的噴墨墨滴形狀規范檢測

通過圖像處理&#xff0c;分析數碼印花的噴頭所噴出來的墨滴形狀&#xff0c;與標準墨滴形狀對比分析&#xff0c;來判斷墨水及其噴頭設備的狀態&#xff0c;由兩部分構成 PS&#xff1a;獲取墨滴形狀照片和標準墨滴形狀照片都是手繪的&#xff0c;將就的看吧&#xff0c;主要…

const_iterator,const 迭代器

const 迭代器:是迭代器產量&#xff0c;該迭代器的值不能被修改&#xff0c;且需要初始化&#xff0c;初始化之后不能指向其他元素。const_iterator:當我們對const_iterator類型解引用時&#xff0c;返回一個const值&#xff0c;所以只能讀&#xff0c;不能寫。它是一種迭代器…

臨時禁止令:諾西購摩托羅拉面臨流產窘境?

近日&#xff0c;美國伊利諾伊州北區法院就中國華為起訴摩托羅拉公司和諾西一案作出初步裁決&#xff0c;禁止摩托羅拉解決方案公司(Motorola Solutions)向諾西披露華為的機密資料。此判決一出&#xff0c;各方評論紛沓而來。筆者認為&#xff0c;從諾西12以美元并購摩托羅拉部…

mysql replace into 語法_mysql Replace into與Insert update

Replace intoreplace into 跟 insert 功能類似&#xff0c;不同點在于&#xff1a;replace into 首先嘗試插入數據到表中&#xff0c;1. 如果發現表中已經有此行數據(根據主鍵或者唯一索引判斷)則先刪除此行數據&#xff0c;然后插入新的數據。2. 否則&#xff0c;直接插入新數…

微機原理——指令系統——傳送類指令(MOV、LEA、LDS、LES、LAHF、SAHF、XCHG、XLAT、PUSH、POP、PUSHF、POPF)

博主聯系方式&#xff1a; QQ:1540984562 QQ交流群&#xff1a;892023501 群里會有往屆的smarters和電賽選手&#xff0c;群里也會不時分享一些有用的資料&#xff0c;有問題可以在群里多問問。 【沒事兒可以到我主頁看看】https://blog.csdn.net/qq_42604176 傳送類指令1&…

lastindexof方法_Java Vector lastIndexOf()方法與示例

lastindexof方法向量類別的lastIndexOf()方法 (Vector Class lastIndexOf() method) Syntax: 句法&#xff1a; public int lastIndexOf (Object ob);public int lastIndexOf (Object ob, int indices);lastIndexOf() method is available in java.util package. lastIndexOf(…

李開復:微博的價值在哪里

導讀&#xff1a;微博可以改變社會現象&#xff0c;可以傳播信息&#xff0c;可以幫助你成長&#xff0c;可以發出你的聲音。它讓我們能夠人人成為記者&#xff0c;讓每一個轉發的人都變成了一個編輯 很多人問微博是搶了誰的生意&#xff0c;開心網還是人人網&#xff1f;其實它…

mysql 任務計劃 /etc/cron.d_Linux /etc/cron.d增加定時任務

一般情況下我們添加計劃任務時&#xff0c;都是直接修改/etc/crontab。但是&#xff0c;不建議這樣做&#xff0c;/etc/cron.d目錄就是為了分項目設置計劃任務而創建的。例如&#xff0c;增加一項定時的備份任務&#xff0c;我們可以這樣處理&#xff1a;在/etc/cron.d目錄下新…

19-Harris角點檢測

角點檢測顧名思義&#xff0c;就是對類似頂點的檢測&#xff0c;與邊緣有所區別 邊緣可能在某一方向上變化不是特別明顯&#xff0c;但角點在任何方向上變換都很明顯 cv2.cornerHarris(img,blockSize,ksize,k) cv2.cornerHarris(gray,2,3,0.04) 參數一&#xff1a;img&#xff…

微機原理——指令系統——算數運算指令(ADD、ADC、SUB、SBB、INC、DEC、NEG、CMP、MUL、IMUL、DIV、IDIV、CBW、CWD、BCD調整)

博主聯系方式&#xff1a; QQ:1540984562 QQ交流群&#xff1a;892023501 群里會有往屆的smarters和電賽選手&#xff0c;群里也會不時分享一些有用的資料&#xff0c;有問題可以在群里多問問。 算數運算指令1、加減法指令ADD、ADC 、SUB 、SBB 和增量減量指令INC、DEC、NEGADD…

linux系統出現Too many open files 錯誤、linux too many open files

故障一、linux too many open files linux系統出現Too many open files 錯誤&#xff0c;這是因為文件描述符大小不夠&#xff0c;或者有不正常的網絡連接(Socket也是一種特殊的文件)、文件IO沒有關閉并釋放出文件描述符&#xff08;文件句柄&#xff0c;File Operator&#xf…

精通init ramfs構建

一、init ramfs是什么   在2.6版本的linux內核中&#xff0c;都包含一個壓縮過的cpio格式的打包文件。當內核啟動時&#xff0c;會 從這個打包文件中導出文件到內核的rootfs文件系統&#xff0c;然后內核檢查rootfs中是否包含有init文件&#xff0c;如果有則執行它&#xff0…

python 示例_帶有示例的Python date isocalendar()方法

python 示例Python date.isocalendar()方法 (Python date.isocalendar() Method) date.isocalendar() method is used to manipulate objects of date class of module datetime. date.isocalendar()方法用于操作模塊datetime的日期類的對象。 It uses a date class object a…

mysql 函數重載_[賦值]函數,變量,重載 ,_第1頁_169IT

[java/j2ee] java實現簡單的給sql語句賦值的示例代碼本身很簡單。拼接sql的時候&#xff1f;不好數&#xff0c;簡單的用來賦值。代碼如下:/** * TODO 循環賦值,缺少的類型可隨時添加 * author Lucius * param pt * param list * throws SQLException */ public static…

20-SIFT算法

import cv2 import numpy as np from matplotlib import pyplot as pltdef show_photo(name,picture):#圖像顯示函數cv2.imshow(name,picture)cv2.waitKey(0)cv2.destroyAllWindows()img cv2.imread(E:\Jupyter_workspace\study\data/cfx.png) gray cv2.cvtColor(img,cv2.COL…

Opencv——寫入或讀取數據到XML或YAML文件

什么是XML、YAML文件 XML(eXtensible Markup Language)是一種元標記語言。所謂“原標記”&#xff0c;就是開發者可以根據自身需要定義的標記&#xff0c;任何滿足XML命名規則的名稱都可以標記。此外&#xff0c;XML是一種語義/結構化語言&#xff0c;它描述了文檔的結構和語義…

mysql 遷移 nosql_從關系型Mysql到Nosql HBase的遷移實踐

2013年11月22-23日&#xff0c;作為國內唯一專注于hadoop技術與應用分享的大規模行業盛會&#xff0c;2013 Hadoop中國技術峰會(China Hadoop Summit 2013)于北京福朋喜來登集團酒店隆重舉行。來自國內外各行業領域的近千名CIO、CTO、架構師、IT經理、咨詢顧問、工程師、Hadoop…