成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Java基礎(chǔ)知識整理之注解

blastz / 3153人閱讀

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

什么是注解?

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

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

總結(jié)

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

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

元注解(meta-annotation)

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

@Target 注解

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

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

ElementType 的值有以下幾種:

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

代碼示例

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

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

對應(yīng)于 @Retention 注解的三個值:

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

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

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

@Documented 注解

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

@Inherited 注解

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

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

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

為注解增加屬性

value 屬性

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

示例

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

給屬性設(shè)置初始值

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

示例

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

數(shù)組類型的屬性

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

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

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

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

注解的重復(fù)機制

@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 沒有引入新的關(guān)鍵字,而是使用 @interface 關(guān)鍵字,來聲明一個注解。我們需要為自定義的注解增加強制性的屬性,保留策略和作用的目標(biāo)。這樣子聲明的直接才有意義。

實例說明

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

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

    public String description();
}

獲取注解

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

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

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

getAnnotation(class): 按照傳入的參數(shù)獲取指定類型的注解。返回null說明當(dāng)前元素不帶有此注解。返回值為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

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/76738.html

相關(guān)文章

  • Java核心技術(shù)教程整理,長期更新

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

    Anchorer 評論0 收藏0
  • Java 總結(jié)

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

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

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

    BakerJ 評論0 收藏0
  • Java進階

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

    sushi 評論0 收藏0
  • Java后端

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

    joyvw 評論0 收藏0

發(fā)表評論

0條評論

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