java元註解和自定義註解

四個元註解分別是:@Target,@Retention,@Documented,@Inherited ,
再次強調下元註解是java API提供,是專門用來定義註解的註解,其作用分別如下:
@Target 表示該註解用於什麼地方,可能的值在枚舉類 ElemenetType 中,包括: 
ElemenetType.CONSTRUCTOR-----------構造器聲明 
ElemenetType.FIELD ----------------域聲明(包括 enum 實例) 
ElemenetType.LOCAL_VARIABLE--------局部變量聲明 
ElemenetType.METHOD ---------------方法聲明 
ElemenetType.PACKAGE --------------包聲明 
ElemenetType.PARAMETER ------------參數聲明 
ElemenetType.TYPE------------------類,接口(包括註解類型)或enum聲明 

@Retention 表示在什麼級別保存該註解信息。
可選的參數值在枚舉類型 RetentionPolicy 中,包括: 
RetentionPolicy.SOURCE ------------註解將被編譯器丟棄 
RetentionPolicy.CLASS -------------註解在class文件中可用,但會被VM丟棄 
RetentionPolicy.RUNTIME VM-------將在運行期也保留註釋,因此可以通過反射機制讀取註解的信息。 

@Documented 將此註解包含在 javadoc 中 ,
它代表着此註解會被javadoc工具提取成文檔。
在doc文檔中的內容會因爲此註解的信息內容不同而不同。相當與@see,@param 等。
@Inherited 允許子類繼承父類中的註解。

自定義註解:
  使用@interface自定義註解時,自動繼承了java.lang.annotation.Annotation接口,由編譯程序自動完成其他細節。在定義註解時,不能繼承其他的註解或接口。@interface用來聲明一個註解,其中的每一個方法實際上是聲明瞭一個配置參數。方法的名稱就是參數的名稱,返回值類型就是參數的類型(返回值類型只能是基本類型、Class、String、enum)。可以通過default來聲明參數的默認值。
  定義註解格式:
  public @interface 註解名 {定義體}
  註解參數的可支持數據類型:
    1.所有基本數據類型(int,float,boolean,byte,double,char,long,short)
    2.String類型
    3.Class類型
    4.enum類型
    5.Annotation類型
    6.以上所有類型的數組
  Annotation類型裏面的參數該怎麼設定:
  第一,只能用public或默認(default)這兩個訪問權修飾.例如,String value();這裏把方法設爲defaul默認類型;   
  第二,參數成員只能用基本類型byte,short,char,int,long,float,double,boolean八種基本數據類型和 String,Enum,Class,annotations等數據類型,以及這一些類型的數組.例如,String value();這裏的參數成員就爲String;  
  第三,如果只有一個參數成員,最好把參數名稱設爲"value",後加小括號.例:下面的例子FruitName註解就只有一個參數成員。

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 水果名稱註解
 * @author peida
 *
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FruitName {
    String value() default "";
}
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 水果顏色註解
 * @author peida
 *
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FruitColor {
    /**
     * 顏色枚舉
     * @author peida
     *
     */
    public enum Color{ BULE,RED,GREEN};
    
    /**
     * 顏色屬性
     * @return
     */
    Color fruitColor() default Color.GREEN;

}
import annotation.FruitColor.Color;

public class Apple {
    
    @FruitName("Apple")
    private String appleName;
    
    @FruitColor(fruitColor=Color.RED)
    private String appleColor;    
    
    public void setAppleColor(String appleColor) {
        this.appleColor = appleColor;
    }
    public String getAppleColor() {
        return appleColor;
    }    
    
    public void setAppleName(String appleName) {
        this.appleName = appleName;
    }
    public String getAppleName() {
        return appleName;
    }
    
    public void displayName(){
        System.out.println("水果的名字是:蘋果");
    }
}
自定義註解可以和AOP結合使用,例如權限註解,或者日誌註解(自定義註解作爲切入點)。

轉載 :http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html

發佈了217 篇原創文章 · 獲贊 39 · 訪問量 54萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章