官术网_书友最值得收藏!

2.4 注解

2.4.1 注解的概念

注解(Annotation)是Java提供的設置程序中元素的關聯信息和元數據(MetaData)的方法,它是一個接口,程序可以通過反射獲取指定程序中元素的注解對象,然后通過該注解對象獲取注解中的元數據信息。

2.4.2 標準元注解:@Target、@Retention、@Documented、@Inherited

元注解(Meta-Annotation)負責注解其他注解。在Java中定義了4個標準的元注解類型@Target、@Retention、@Documented、@Inherited,用于定義不同類型的注解。

(1)@Target:@Target說明了注解所修飾的對象范圍。注解可被用于packages、types(類、接口、枚舉、注解類型)、類型成員(方法、構造方法、成員變量、枚舉值)、方法參數和本地變量(循環變量、catch參數等)。在注解類型的聲明中使用了target,可更加明確其修飾的目標,target的具體取值類型如表2-1所示。

表2-1

(2)@Retention:@Retention定義了該注解被保留的級別,即被描述的注解在什么級別有效,有以下3種類型。

◎ SOURCE:在源文件中有效,即在源文件中被保留。

◎ CLASS:在Class文件中有效,即在Class文件中被保留。

◎ RUNTIME:在運行時有效,即在運行時被保留。

(3)@Documented:@Documented表明這個注解應該被javadoc工具記錄,因此可以被javadoc類的工具文檔化。

(4)@Inherited:@Inherited是一個標記注解,表明某個被標注的類型是被繼承的。如果有一個使用了@Inherited修飾的Annotation被用于一個Class,則這個注解將被用于該Class的子類。

2.4.3 注解處理器

注解用于描述元數據的信息,使用的重點在于對注解處理器的定義。Java SE5擴展了反射機制的API,以幫助程序快速構造自定義注解處理器。對注解的使用一般包含定義及使用注解接口,我們一般通過封裝統一的注解工具來使用注解。

1.定義注解接口

下面的代碼定義了一個FruitProvider注解接口,其中有name和address兩個屬性:

//1:定義注解接口
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public  @interface  FruitProvider  {
 //供應商編號
 public  int  id()  default  -1;
 //供應商名稱
 public String name() default "";
 //供應商地址
 public  String  address()  default  "";
}

2.使用注解接口

下面的代碼定義了一個Apple類,并通過注解方式定義了一個FruitProvider:

public  class  Apple  {
  //2:使用注解接口
    @FruitProvider(id = 1, name = "陜西紅富士集團", address = "陜西省西安市")
    private  String  appleProvider;
    public  void  setAppleProvider(String  appleProvider)  {
      this.appleProvider  =  appleProvider;
    }
    public  String  getAppleProvider()  {
      return  appleProvider;
    }
}

3.定義注解處理器

下面的代碼定義了一個FruitInfoUtil注解處理器,并通過反射信息獲取注解數據,最后通過main方法調用該注解處理器使用注解:

//3:定義注解處理器
public  class  FruitInfoUtil  {
    public  static  void  getFruitInfo(Class<? >  clazz)  {
      String strFruitProvicer = "供應商信息:";
      Field[] fields = clazz.getDeclaredFields(); //通過反射獲取處理注解
      for  (Field  field  :  fields)  {
          if  (field.isAnnotationPresent(FruitProvider.class))  {
                FruitProvider  fruitProvider  =  (FruitProvider)
                          field.getAnnotation(FruitProvider.class);
                    //處理注解信息
              strFruitProvicer = " 供應商編號:" + fruitProvider.id() +
                    " 供應商名稱:"+ fruitProvider.name() + " 供應商地址:"+
                      fruitProvider.address();
            System.out.println(strFruitProvicer);
          }
      }
  }
}
public  class  FruitRun  {
  public  static  void  main(String[]  args)  {
      FruitInfoUtil.getFruitInfo(Apple.class);
        //輸出結果為:供應商編號:1 供應商名稱:陜西紅富士集團 供應商地址:陜西省西安市
  }
}
主站蜘蛛池模板: 通渭县| 宁陕县| 保亭| 广东省| 朝阳市| 西城区| 揭阳市| 罗定市| 岑巩县| 德庆县| 县级市| 红安县| 台东县| 蓬溪县| 怀化市| 寿阳县| 丰都县| 广德县| 洛阳市| 十堰市| 改则县| 湄潭县| 皋兰县| 内黄县| 印江| 太仆寺旗| 孝感市| 武清区| 获嘉县| 武安市| 湟中县| 伽师县| 略阳县| 阿拉善盟| 潼关县| 甘孜| 莒南县| 瓮安县| 筠连县| 镇雄县| 旅游|