激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java基礎教程之理解Annotation詳細介紹

Java基礎教程之理解Annotation詳細介紹

2020-08-02 11:44lqh Java教程

這篇文章主要介紹了Java基礎教程之理解Annotation詳細介紹的相關資料,需要的朋友可以參考下

Java基礎之理解Annotation

一、概念

   Annontation是Java5開始引入的新特征。中文名稱一般叫注解。它提供了一種安全的類似注釋的機制,用來將任何的信息或元數據(metadata)與程序元素(類、方法、成員變量等)進行關聯。

  更通俗的意思是為程序的元素(類、方法、成員變量)加上更直觀更明了的說明,這些說明信息是與程序的業務邏輯無關,并且是供指定的工具或框架使用的。

Annontation像一種修飾符一樣,應用于包、類型、構造方法、方法、成員變量、參數及本地變量的聲明語句中。

二、原理

  Annotation其實是一種接口。通過Java的反射機制相關的API來訪問annotation信息。相關類(框架或工具中的類)根據這些信息來決定如何使用該程序元素或改變它們的行為。

  annotation是不會影響程序代碼的執行,無論annotation怎么變化,代碼都始終如一地執行。

  Java語言解釋器在工作時會忽略這些annotation,因此在JVM 中這些annotation是“不起作用”的,只能通過配套的工具才能對這些annontaion類型的信息進行訪問和處理。

  Annotation與interface的異同:

    1)、Annotation類型使用關鍵字@interface而不是interface。

  這個關鍵字聲明隱含了一個信息:它是繼承了java.lang.annotation.Annotation接口,并非聲明了一個interface

    2)、Annotation類型、方法定義是獨特的、受限制的。

  Annotation 類型的方法必須聲明為無參數、無異常拋出的。這些方法定義了annotation的成員:方法名成為了成員名,而方法返回值成為了成員的類型。而方法返回值類型必須為primitive類型、Class類型、枚舉類型、annotation類型或者由前面類型之一作為元素的一維數組。方法的后面可以使用 default和一個默認數值來聲明成員的默認值,null不能作為成員默認值,這與我們在非annotation類型中定義方法有很大不同。

  Annotation類型和它的方法不能使用annotation類型的參數、成員不能是generic。只有返回值類型是Class的方法可以在annotation類型中使用generic,因為此方法能夠用類轉換將各種類型轉換為Class。

    3)、Annotation類型又與接口有著近似之處。

  它們可以定義常量、靜態成員類型(比如枚舉類型定義)。Annotation類型也可以如接口一般被實現或者繼承。

三、應用場合

  annotation一般作為一種輔助途徑,應用在軟件框架或工具中,在這些工具類中根據不同的 annontation注解信息采取不同的處理過程或改變相應程序元素(類、方法及成員變量等)的行為。

  例如:Junit、Struts、Spring等流行工具框架中均廣泛使用了annontion。使代碼的靈活性大提高。

 四、常見標準的Annotation

  從java5版本開始,自帶了三種標準annontation類型,

   ?。?)、Override

  java.lang.Override 是一個marker annotation類型,它被用作標注方法。它說明了被標注的方法重載了父類的方法,起到了斷言的作用。如果我們使用了這種annotation在一個沒有覆蓋父類方法的方法時,java編譯器將以一個編譯錯誤來警示。

  這個annotaton常常在我們試圖覆蓋父類方法而確又寫錯了方法名時加一個保障性的校驗過程。

   ?。?)、Deprecated

  Deprecated也是一種marker annotation。當一個類型或者類型成員使用@Deprecated修飾的話,編譯器將不鼓勵使用這個被標注的程序元素。所以使用這種修飾具有一定的 “延續性”:如果我們在代碼中通過繼承或者覆蓋的方式使用了這個過時的類型或者成員,雖然繼承或者覆蓋后的類型或者成員并不是被聲明為 @Deprecated,但編譯器仍然要報警。

  注意:@Deprecated這個annotation類型和javadoc中的 @deprecated這個tag是有區別的:前者是java編譯器識別的,而后者是被javadoc工具所識別用來生成文檔(包含程序成員為什么已經過時、它應當如何被禁止或者替代的描述)。

   ?。?)、SuppressWarnings

  此注解能告訴Java編譯器關閉對類、方法及成員變量的警告。

  有時編譯時會提出一些警告,對于這些警告有的隱藏著Bug,有的是無法避免的,對于某些不想看到的警告信息,可以通過這個注解來屏蔽。

  SuppressWarning不是一個marker annotation。它有一個類型為String[]的成員,這個成員的值為被禁止的警告名。對于javac編譯器來講,被-Xlint選項有效的警告名也同樣對@SuppressWarings有效,同時編譯器忽略掉無法識別的警告名。

  annotation語法允許在annotation名后跟括號,括號中是使用逗號分割的name=value對用于為annotation的成員賦值:

代碼:

?
1
2
3
@SuppressWarnings(value={"unchecked","fallthrough"})
 
public void lintTrap() { /* sloppy method body omitted */ }

在這個例子中SuppressWarnings annotation類型只定義了一個單一的成員,所以只有一個簡單的value={...}作為name=value對。又由于成員值是一個數組,故使用大括號來聲明數組值。

注意:我們可以在下面的情況中縮寫annotation:當annotation只有單一成員,并成員命名為"value="。這時可以去"value="。比如將上面的SuppressWarnings annotation進行縮寫:

代碼:

?
1
@SuppressWarnings({"unchecked","fallthrough"})

如果SuppressWarnings所聲明的被禁止警告個數為一個時,可以省去大括號:

?
1
@SuppressWarnings("unchecked")

五、自定義annontation示例

  示例共涉及四個類:

  清單1:Author.java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package com.magc.annotation;
 
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;
 
  /**
   * 定義作者信息,name和group
   * @author magc
   *
   */
  @Retention(RetentionPolicy.RUNTIME)
  @Target(ElementType.METHOD)
  @Documented
public @interface Author {
 
    String name();
    String group();
}

  清單2:Description.java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
 *
 */
package com.magc.annotation;
 
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 magc
 *
 * 定義描述信息 value
 */
  @Retention(RetentionPolicy.RUNTIME)
  @Target(ElementType.TYPE)
  @Documented
  
public @interface Description {
    String value();
}

清單3:Utility.java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.magc.annotation;
 
  @Description(value = "這是一個有用的工具類")
public class Utility {
 
    @Author(name = "haoran_202",group="com.magc")
    public String work()
    {
      return "work over!";
    }
    
    
  
}

注:這是個普通的Java類,運行了@Description和@Author注解。

清單3:AnalysisAnnotation.java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package com.magc.annotation;
 
import java.lang.reflect.Method;
 
public class AnalysisAnnotation {
  /**
   * 在運行時分析處理annotation類型的信息
   *
   *
   */
  public static void main(String[] args) {
    try {
        //通過運行時反射API獲得annotation信息
        Class rt_class = Class.forName("com.magc.annotation.Utility");
        Method[] methods = rt_class.getMethods();
        
        boolean flag = rt_class.isAnnotationPresent(Description.class);
        
        if(flag)
        {
          Description description = (Description)rt_class.getAnnotation(Description.class);
          System.out.println("Utility's Description--->"+description.value());
          for (Method method : methods) {
            if(method.isAnnotationPresent(Author.class))
            {
              Author author = (Author)method.getAnnotation(Author.class);
              System.out.println("Utility's Author--->"+author.name()+" from "+author.group());
              
            }
          }
        }
      
      
      } catch (ClassNotFoundException e) {
        e.printStackTrace();
      }
  }
 
}

注:這是個與自定義@Description和@Author配套的基礎框架或工具類,通過此類來獲得與普通Java類Utility.java關聯的信息,即描述和作者。

運行AnalysisAnnotation,輸出結果為:

Utility's Description--->這是一個有用的工具類
Utility's Author--->haoran_202 from com.magc

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

原文鏈接:http://blog.csdn.net/feixiaoxing/article/details/6885657

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲第一页视频 | 美女羞羞视频网站 | 免费h片网站 | 沉沦的校花奴性郑依婷c到失禁 | 午夜色视频在线观看 | 一区二区三区黄色 | chengrenzaixian| 欧美日韩高清在线观看 | 污版视频在线观看 | 欧美人与牲禽动交精品一区 | 毛片午夜| 日韩一级免费毛片 | 精品久久久久久综合日本 | 91高清免费在线观看 | 国产精品免费成人 | 欧美人与性禽动交精品 | 久久一区二区三区av | 羞羞视频一区二区 | 欧美色视 | 羞羞电影在线观看 | 亚洲欧美国产视频 | 美女羞羞视频网站 | 欧美成人久久 | 法国性xxx精品hd专区 | 国产亚洲激情 | 免费一级毛片在线播放不收费 | xxxx8 | 5a级毛片| 中文字幕一区在线观看视频 | 巨乳毛片| 欧美精品一级 | 澳门一级淫片免费视频 | 中文字幕一二三区芒果 | 免费视频爱爱太爽了 | 97中文 | 99在线热视频 | 一级免费黄色免费片 | 护士hd欧美free性xxxx | 成年性羞羞视频免费观看无限 | 成人h视频在线 | 深夜视频在线观看 |