java註解簡介

來源:互聯網
上載者:User

標籤:java   註解   

註解簡單的理解成在代碼中加註額外資訊的一種手段,這些資訊可以再稍後的某個時刻使用,使用時與反射配合。主要用來:

  • 產生文檔
  • 跟蹤代碼依賴
  • 編譯時間檢查

從分類上看來,java定義了三類註解:

  • jdk內建的系統註解,編譯時間檢查(@Override,@Deprecated,@SuppressWarnings)
  • 元註解,專職負責註解其他註解(@Target,@Retention,@Documented,@Inherited)
  • 自訂註解

一般說來,註解存在於一個單獨的.java檔案中,會被編譯成.class檔案。

系統內建註解

@Override用來編譯時間檢查方法覆蓋父類方法,只能修飾方法。查看@Override的實現可以看到:

@Target(ElementType.METHOD)@Retention(RetentionPolicy.SOURCE)public @interface Override { }

@Override註解被兩個元註解修飾,@Target和@Retention。這兩個註解分別表示@Override這個註解修飾的是方法,並且只保留在源碼層級,編譯時間將被編譯器丟棄。

@Deprecated用來提示這個部分已經不推薦使用,已經過時

@Documented@Retention(RetentionPolicy.RUNTIME)@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})public @interface Deprecated { }

從代碼可以看出,不推薦使用的部分可以使類,介面,構造器,域聲明,局部變數,方法聲明,參數聲明。VM在運行期間也保留註解。@Documented說明這個註解包含在javadoc中。

@SuppressWarnings關閉編譯器不當的警告資訊

@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})@Retention(RetentionPolicy.SOURCE)public @interface SuppressWarnings {        String[] value();}

定義體裡面的 String[] value(); 是註解元素,可以想象成變數。使用時需要為@SuppressWarnings的value指定值。例如:

@SuppressWarnings(value={ "deprecation", "unchecked" })

表示關閉過時警告和未檢查的類型轉換警告

元註解

@Target 表示該註解使用範圍,可能的ElementType參數包括:

  • CONSTRUCTOR:構造器的聲明
  • FIELD:域聲明(包括enum執行個體)
  • LOCAL_VARIABLE:局部變數聲明
  • METHOD:方法聲明
  • PACKAGE:包生明
  • PARAMETER:參數聲明
  • TYPE:類,介面(包括註解類型)或enum類型

@Retention 表示註解的保留層級,可能的RetentionPolicy參數包括:

  • SOURCE:註解將被編譯器丟棄
  • CLASS:註解在class檔案中可用,但會被VM丟棄
  • RUNTIME:VM將在運行期也保留註解,因此可以通過反射機制讀取註解裡的資訊

@Documented 將註解包含在javadoc中
@Inherited 允許子類繼承父類中的註解

自訂註解

定義方式很像,例如:

@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface Test{    public int id();    public String description() default "no description";}

id是int類型的註解元素,description是String類型的註解元素,預設值”no description”。沒有設定預設值的註解元素需要在使用時顯示賦值,就像@SuppressWarnings一樣。因為保留類型是RUNTIME,所以能夠在程式運行期間拿到。例如:

class TT {    @Test(id = 0)    public void annot0() { System.out.println("runtime annotation test"); }    @Test(id = 1, description = "just for fun")    public void annot1() { }}public class App{    public static void main( String[] args )    {        Class<?> cl = TT.class;        for(Method m : cl.getDeclaredMethods()) {            Test t = m.getAnnotation(Test.class);            if(t != null) {                System.out.println("Found Annotation Test: id="+t.id()                        +" descripition="+t.description());            }        }    }}

輸出:
Found Annotation Test: id=0 descripition=no description
Found Annotation Test: id=1 descripition=just for fun
註解元素可以包含的類型有:

  • 所有基本類型(int,float,boolean等)
  • String
  • Class
  • enum
  • Annotation
  • 以上類型的數組

通過自訂註解,並編寫出街處理器,可以在運行時利用註解幹很多有意思的事情。

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

java註解簡介

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.