Introduction of Annotation

Annotation介紹

概念

   註解Annotation是java 1.5的新特性,是一種可以添加到 Java 源代碼的語法元數據。類、方法、變量、參數、包均可以被註解,可用來將信息元數據與程序元素進行關聯。java

做用

a. 標記,用於告訴編譯器一些信息

b. 編譯時動態處理,如動態生成代碼

c. 運行時動態處理,如獲得註解信息數組


  Java註解能夠用在構建期。當構建咱們的工程時,構建進程會編譯源碼、生成xml文件,打包編譯後的代碼和文件到jar包。構建過程通常由構建工具自動完成,經常使用的構建工具備ant、maven。構建工具在構建時會自動掃描咱們的代碼,當遇到構建期註解時,會根據註解的內容生成源碼或者其它文件。

架構

註解的格式

a)一個java註解由一個@符後面跟一個字符串構成,例如:@nameapp

b)java註解中通常包含一些元素,這些元素相似於屬性或者參數,能夠用來設置值,例如@Enity(name="jiang",age="20")maven

使用細節

  註解能夠用於描述一個類、接口、方法、方法參數、字段、局部變量等。ide

 1.若是註解沒有參數則不用寫參數體工具

 2.若是隻有一個參數好比named value,則參數名能夠省略this

 3.也能夠同時使用多個註解來標示spa

 4.能夠重複使用註解,不過只有在java SE 8 才支持.net

Java 經常使用註解

內置註解

  • @Override 表示當前方法覆蓋了父類的方法,主要用在一個子類的方法中。
  • @Deprecated 表示方法已通過時,java不同意使用這些被描述的對象方法上有橫線,使用時會有警告
  • @SuppviseWarnings 表示關閉一些警告信息(通知java編譯器忽略特定的編譯警告,例如進行了一個不安轉的類型轉換)。

元註解:用來描述註解的註解

  • @Documented:告訴JavaDoc工具,當前註解自己也要顯示在Java Doc中。
  • @Retention:用來定義當前註解的做用範圍,有如下範圍:
    • RetentionPolicy.SOURCE : 註解只存在於源碼中,不會存在於.class文件中,在編譯時會被忽略掉
    • RetentionPolicy.CLASS:註解只存在於.class文件中,在編譯期有效,可是在運行期會被忽略掉,這也是默認範圍
    • RetentionPolicy.RUNTIME:在運行期有效,JVM在運行期經過反射得到註解信息。
  • @Target:用於指定註解做用於java的哪些元素,未標註則表示可修飾全部。
  • @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.以上全部類型的數組

       註解元素必須有肯定的值,要麼在定義註解的默認值中指定,要麼在使用註解時指定,非基本類型的註解元素的值不可爲null。所以, 使用空字符串或0做爲默認值是一種經常使用的作法。這個約束使得處理器很難表現一個元素的存在或缺失的狀態,由於每一個註解的聲明中,全部元素都存在,而且都具備相應的值,爲了繞開這個約束,咱們只能定義一些特殊的值,例如空字符串或者負數,一次表示某個元素不存在,在定義註解時,這已經成爲一個習慣用法。

上手實驗

a.java
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;

/**
 * 
 * 水果名稱註解
 *
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface front{ //自定義註解 @front
    String value() default "";
}
b.java
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;
/**
 * 
 * 水果顏色註解
 *
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented

public @interface behind{//自定義註解@behind
    public enum Color{bule,red,green}
    Color Behind() default Color.red;
}

c.java 部分
    @front("Apple")
    private String appleName;
    
    @behind(Behind=Color.green)
    private  String appleColor;
    public void setAppleColor(String appleColor) {
        this.appleColor = appleColor;
         }
 
 

   在以前沒有具體瞭解清楚annotation的功能,覺得在註解以後相應的變量會被賦值,因此在進行調試的時候看到變量的值一直都是null,爲此感到很困惑,覺得是本身的哪些方法不對。後來經過仔細查閱發現annotation僅僅是相似於標籤以及接口,對代碼的運行沒有起到什麼效果。

 

 總結

  1. 若是註解難於理解,你就把它類同於標籤,標籤爲了解釋事物,註解爲了解釋代碼。
  2. 註解的基本語法,建立如同接口,可是多了個 @ 符號。
  3. 註解的元註解。
  4. 註解的屬性。
  5. 註解主要給編譯器及工具類型的軟件用的。
  6. 註解的提取須要藉助於 Java 的反射技術,反射比較慢,因此註解使用時也須要謹慎計較時間成本。

the examples in Hello1.java

hello1 :一個基於JavaServer Faces技術的應用程序,它使用兩個XHTML頁面和一個託管bean

 首先須要瞭解 構造型:一種指定一下內容的註釋:

  • 默認範圍

  • 零個或多個攔截器綁定

  • (可選)@Named註釋,保證默認EL命名

  • (可選)@Alternative註釋,指定具備此構造型的全部bean都是備選方案

     CDI提供了一個名爲的內置構造型Model,它用於定義模型 - 視圖 - 控制器應用程序架構的模型層的bean。這個構造型指定bean是@Named@RequestScoped

@Named @RequestScoped @Stereotype @Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME) public @interface Model {}
import javax.enterprise.context.RequestScoped;
/**
 * 雖然RequestScoped必須與規範要求的內置請求上下文相關聯,但容許第三方擴展將其與本身的上下文相關聯。
 * 指定bean是請求範圍的
 * 1.請求範圍處於活動狀態  
 * 2.請求上下文被銷燬
 */
import javax.inject.Named;
/**
 * 基於字符串的限定符
 * Example usage:
   public class Car {
     @Inject @Named("driver") Seat driverSeat;
     @Inject @Named("passenger") Seat passengerSeat;
     ...
   }
 *若是使用bean類的默認名稱,則能夠指定@Model 爲註釋,而沒必要同時指定@Named和@RequestScoped.
 *該@Model註釋被稱爲刻板印象,對於封裝等註解註釋的術語。
 */
//
@Named
@RequestScoped
public class Hello {}

部分借鑑於:https://blog.csdn.net/u013703461/article/details/66259013

             https://blog.csdn.net/briblue/article/details/73824058

                    很是感謝~

相關文章
相關標籤/搜索