亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

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

blastz / 3203人閱讀

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

什么是注解?

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

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

總結(jié)

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

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

元注解(meta-annotation)

元注解的作用就是負(fù)責(zé)注解其他注解。 Java5.0定義了4個(gè)標(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ùn)行時(shí))。

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

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

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

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

@Documented 注解

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

@Inherited 注解

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

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

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

為注解增加屬性

value 屬性

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

示例

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

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

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

示例

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

數(shù)組類型的屬性

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

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

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

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

注解的重復(fù)機(jī)制

@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)鍵字,來聲明一個(gè)注解。我們需要為自定義的注解增加強(qiáng)制性的屬性,保留策略和作用的目標(biāo)。這樣子聲明的直接才有意義。

實(shí)例說明

CustomAnnotation.java

import java.lang.annotation.*;

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


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

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

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

    public String description();
}

獲取注解

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

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

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

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

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

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;
            }

            // 獲取到指定的注解類型,并且將其實(shí)例化
            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://www.ezyhdfw.cn/yun/76738.html

相關(guān)文章

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

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

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

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

    caspar 評論0 收藏0
  • Java進(jìn)階路 - 收藏集 - 掘金

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

    BakerJ 評論0 收藏0
  • Java進(jìn)階

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

    sushi 評論0 收藏0
  • Java后端

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

    joyvw 評論0 收藏0

發(fā)表評論

0條評論

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