国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Java基礎知識整理之注解

blastz / 3138人閱讀

摘要:注解提供了一種安全的類似注釋的機制,用來將任何的信息或元數據與程序元素類方法成員變量等進行關聯。為程序的元素類方法成員變量加上更直觀更明了的說明,這些說明與程序的業務邏輯無關,并且提供給指定的工具或框架使用。

什么是注解?

Annotation 是 Java5 之后開始引入的新特性,中文為注解。注解提供了一種安全的類似注釋的機制,用來將任何的信息或元數據(metadata)與程序元素(類、方法、成員變量等)進行關聯。為程序的元素(類、方法、成員變量)加上更直觀更明了的說明,這些說明與程序的業務邏輯無關,并且提供給指定的工具或框架使用。

Java注解是附加在代碼中的一些元信息,用于一些工具在編譯、運行時進行解析和使用,起到說明、配置的功能。注解不會也不能影響代碼的實際邏輯,僅僅起到輔助性的作用。包含在 java.lang.annotation 包中。

總結

==注解(Annotation)相當于一種標記,在程序中加入注解就等于為程序打上某種標記==,沒有加,則等于沒有任何標記,以后,javac編譯器、開發工具和其他程序可以通過反射來了解你的類及各種元素上有無何種標記,看你的程序有什么標記,就去干相應的事,==標記可以加在包、類,屬性、方法,方法的參數以及局部變量上。==

一個注解準確意義上來說,只不過是一種特殊的注釋而已,如果沒有解析它的代碼,它可能連注釋都不如。

元注解(meta-annotation)

元注解的作用就是負責注解其他注解。 Java5.0定義了4個標準的meta-annotation類型,它們被用來提供對其它 annotation類型作說明。他們分別是 @Target、@Retetion、@Documented、@Inherited

@Target 注解

@Target 的作用:就是說明注解可以用在什么地方。

@Target說明了Annotation所修飾的對象范圍:Annotation可被用于 packages、types(類、接口、枚舉、Annotation類型)、類型成員(方法、構造方法、成員變量、枚舉值)、方法參數和本地變量(如循環變量、catch參數)。在Annotation類型的聲明中使用了target可更加明晰其修飾的目標。

ElementType 的值有以下幾種:

1.CONSTRUCTOR: 用于描述構造器
2.FIELD: 用于描述域
3.LOCAL_VARIABLE: 用于描述局部變量
4.METHOD: 用于描述方法
5.PACKAGE: 用于描述包
6.PARAMETER: 用于描述參數
7.TYPE: 用于描述類、接口(包括注解類型) 或enum聲明

代碼示例

// 下面的注解可以作用在字段上面
@Target(ElementType.FIELD)
public @interface MyAnnotation {
}
@Retention 注解

@Retention 注解決定 注解的生命周期。我們的java程序執行的順序: Java源文件(x.java文件) ---> .class(編譯為 class 文件) ---> 內存中的字節碼文件(運行時)。

對應于 @Retention 注解的三個值:

RetentionPolicy.SOURCE:在源文件中有效(即源文件保留)。在編譯階段丟棄,這些注解在編譯結束之后就沒有任何意義了。

RetentionPolicy.CLASS:在class文件中有效(即class保留)。在類加載的時候丟棄。注解默認是使用這種方式。

RetentionPolicy.RUNTIME:在運行時有效(即運行時保留)。始終不丟棄,運行期也保留該注解。因此可以使用反射機制讀取該注解的信息。我們自定義的注解通常使用這種方式。

@Documented 注解

一個簡單的Annotations標記注解,表示是否將注解信息添加在java文檔中。

@Inherited 注解

 @Inherited 元注解是一個標記注解,@Inherited闡述了某個被標注的類型是被繼承的。如果一個使用了@Inherited修飾的annotation類型被用于一個class,則這個annotation將被用于該class的子類。

  注意:@Inherited annotation類型是被標注過的class的子類所繼承。類并不從它所實現的接口繼承annotation,方法并不從它所重載的方法繼承annotation。

  當@Inherited annotation類型標注的annotation的Retention是RetentionPolicy.RUNTIME,則反射API增強了這種繼承性。如果我們使用java.lang.reflect去查詢一個@Inherited annotation類型的annotation時,反射代碼檢查將展開工作:檢查class和其父類,直到發現指定的annotation類型被發現,或者到達類繼承結構的頂層。
  

為注解增加屬性

value 屬性

value 屬性是一個特殊的屬性。當注解中使用的屬性名為value時,對其賦值時可以不指定屬性名稱而直接寫上屬性值接口;除了value以外的變量名都需要使用 name = value 的方式賦值。

示例

@SuppressWarnings("deprecation")    // 在使用的地方

給屬性設置初始值

即在定義注解的時候,就給某些字段附上初始值。

示例

String value() default "config";    // 在自定義注解的地方

數組類型的屬性

int[] intArray() default {1,2,3};    // 在自定義注解的地方

CustomAnnotation(ingArray = {4,5,6})    // 在使用注解的地方

CustomAnnotation(ingArray = 7)          // 如果數組屬性中只有一個元素時,屬性值部分可以省略大括號。
java 8 對注解的增強

@Repeatable注解,關于類型注解的聲明,函數式接口注解@FunctionalInterface(與Lambdas結合使用)。@Repeatable:說明該注解標識的注解可以多次使用到同一個元素的聲明上。

注解的重復機制

@Repeatable(Annotations.class) 
public @interface MyAnnotation {  
     String role();  
}  
 
public @interface Annotations {  
    MyAnnotation[] value();  
}  
 
public class RepeatAnnotationUseOldVersion {  
    @MyAnnotation(role="Admin")  
    @MyAnnotation(role="Manager")
    public void doSomeThing(){  
    }  
} 
自定義注解

注解的聲明方式

@Retention(value=RUNTIME)    // value的值是可以改變的, RUNTIME 只是作為demo
@Target(value=TYPE)          // value的值是可以改變的, TYPE 只是作為demo
public @interface CustomAnnotationClass{}

對于注解的聲明,由于 java 沒有引入新的關鍵字,而是使用 @interface 關鍵字,來聲明一個注解。我們需要為自定義的注解增加強制性的屬性,保留策略和作用的目標。這樣子聲明的直接才有意義。

實例說明

CustomAnnotation.java

import java.lang.annotation.*;

import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;


@Retention(value=RUNTIME)     // RUNTIME 告訴程序這個注解不會被丟棄,可以通過反射來獲取
@Target(value=METHOD)   // 通過 METHOD 屬性,可以讓注解在方法上面
public @interface CustomAnnotation {

    /* value:是一個特殊的屬性,若在設置值時只有一個value屬性需要設置或者其他屬性都采用默認值時 ,
    那么value=可以省略,直接寫所設置的值即可。 */
    String value(); // 注解只要一個變量時,變量名必須為 value

    /* 我們所有的方法聲明都不能有參數和throw 子句 */
    public String name() default "Wayfreem";

    public String description();
}

獲取注解

我們獲取注解一般通過反射的方式來獲取。java 反射API提供了許多方法,在運行時從類、方法獲取其他元素上面獲取注解信息。下面列出常用的方法:

getAnnotations(): 返回該元素的所有注解,包括沒有顯式定義該元素上的注解。

isAnnotationPresent(annotation): 檢查傳入的注解是否存在于當前元素。

getAnnotation(class): 按照傳入的參數獲取指定類型的注解。返回null說明當前元素不帶有此注解。返回值為Annotation[]。

getMethod(String name, Class... parameterTypes):獲取某個方法

public class TestAnnotation {

    @CustomAnnotation(value = "test1", name = "測試1", description = "測試方法1")
    private void method1(){}

    @CustomAnnotation(value = "test2", name = "測試2", description = "測試方法2")
    public void method2(){}

    @CustomAnnotation(value = "test3", name = "測試3", description = "測試方法3")
    public void method3(){}

    public void menthod4(){}

    public static void main(String[] args) {

        // 通過反射來回去所有聲明的方法(包含還有加上了注解了的和未注解的 )
        Method[] methods = TestAnnotation.class.getDeclaredMethods();

        for (Method method: methods){

            // 傳入指定的注解,判斷是否為傳入的注解類型
            boolean flag = method.isAnnotationPresent(CustomAnnotation.class);
            if(!flag){
                continue;
            }

            // 獲取到指定的注解類型,并且將其實例化
            CustomAnnotation customAnnotation = method.getAnnotation(CustomAnnotation.class);
            // 獲取到自定義的注解中的值
            System.out.println("value : "+customAnnotation.value() + 
                    ", name:" + customAnnotation.name() + 
                    ", description:"+ customAnnotation.description());
        }
    }
}

控制臺輸出

value : test1, name:測試1, description:測試方法1
value : test2, name:測試2, description:測試方法2
value : test3, name:測試3, description:測試方法3

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/76738.html

相關文章

  • Java核心技術教程整理,長期更新

    以下是Java技術棧微信公眾號發布的關于 Java 的技術干貨,從以下幾個方面匯總。 Java 基礎篇 Java 集合篇 Java 多線程篇 Java JVM篇 Java 進階篇 Java 新特性篇 Java 工具篇 Java 書籍篇 Java基礎篇 8張圖帶你輕松溫習 Java 知識 Java父類強制轉換子類原則 一張圖搞清楚 Java 異常機制 通用唯一標識碼UUID的介紹及使用 字符串...

    Anchorer 評論0 收藏0
  • Java 總結

    摘要:中的詳解必修個多線程問題總結個多線程問題總結有哪些源代碼看了后讓你收獲很多,代碼思維和能力有較大的提升有哪些源代碼看了后讓你收獲很多,代碼思維和能力有較大的提升開源的運行原理從虛擬機工作流程看運行原理。 自己實現集合框架 (三): 單鏈表的實現 自己實現集合框架 (三): 單鏈表的實現 基于 POI 封裝 ExcelUtil 精簡的 Excel 導入導出 由于 poi 本身只是針對于 ...

    caspar 評論0 收藏0
  • Java進階路 - 收藏集 - 掘金

    摘要:請欣賞語法清單后端掘金語法清單翻譯自的,從屬于筆者的入門與實踐系列。這篇一篇框架整合友好的文章三后端掘金一理論它始終是圍繞數據模型頁面進行開發的。 RxJava 常用操作符 - Android - 掘金 原文地址 http://reactivex.io/documenta... ... RxJava 和 Retrofit 結合使用完成基本的登錄和注冊功能 - Android - 掘...

    BakerJ 評論0 收藏0
  • Java進階

    摘要:探索專為而設計的將探討進行了何種改進,以及這些改進背后的原因。關于最友好的文章進階前言之前就寫過一篇關于最友好的文章反響很不錯,由于那篇文章的定位就是簡單友好,因此盡可能的摒棄復雜的概念,只抓住關鍵的東西來講,以保證大家都能看懂。 周月切換日歷 一個可以進行周月切換的日歷,左右滑動的切換月份,上下滑動可以進行周,月不同的視圖切換,可以進行事件的標記,以及節假日的顯示,功能豐富 Andr...

    sushi 評論0 收藏0
  • Java后端

    摘要:,面向切面編程,中最主要的是用于事務方面的使用。目標達成后還會有去構建微服務,希望大家多多支持。原文地址手把手教程優雅的應用四手把手實現后端搭建第四期 SpringMVC 干貨系列:從零搭建 SpringMVC+mybatis(四):Spring 兩大核心之 AOP 學習 | 掘金技術征文 原本地址:SpringMVC 干貨系列:從零搭建 SpringMVC+mybatis(四):Sp...

    joyvw 評論0 收藏0

發表評論

0條評論

blastz

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<