欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一文詳解Java中的注解(Annotation)

 更新時(shí)間:2024年03月16日 09:38:44   作者:笑小楓  
在Java中注解(Annotation)引入始于Java5,用來描述Java代碼的元信息,通常情況下注解不會直接影響代碼的執(zhí)行,盡管有些注解可以用來做到影響代碼執(zhí)行,這篇文章主要給大家介紹了關(guān)于Java中注解(Annotation)的相關(guān)資料,需要的朋友可以參考下

在Java中,注解(Annotation)引入始于Java5,用來描述Java代碼的元信息,通常情況下注解不會直接影響代碼的執(zhí)行,盡管有些注解可以用來做到影響代碼執(zhí)行。

注解可以做什么

Java中的注解通常扮演以下角色

  • 編譯器指令
  • 構(gòu)建時(shí)指令
  • 運(yùn)行時(shí)指令

其中

  • Java內(nèi)置了三種編譯器指令,本文后面部分會重點(diǎn)介紹
  • Java注解可以應(yīng)用在構(gòu)建時(shí),即當(dāng)你構(gòu)建你的項(xiàng)目時(shí)。構(gòu)建過程包括生成源碼,編譯源碼,生成xml文件,打包編譯的源碼和文件到JAR包等。軟件的構(gòu)建通常使用諸如Apache Ant和Maven這種工具自動(dòng)完成。這些構(gòu)建工具會依照特定的注解掃描Java代碼,然后根據(jù)這些注解生成源碼或文件。
  • 通常情況下,注解并不會出現(xiàn)在編譯后的代碼中,但是如果想要出現(xiàn)也是可以的。Java支持運(yùn)行時(shí)的注解,使用Java的反射我們可以訪問到這些注解,運(yùn)行時(shí)的注解的目的通常是提供給程序和第三方API一些指令。

注解基礎(chǔ)

一個(gè)簡單的Java注解類似與@Entity。其中@的意思是告訴編譯器這是一個(gè)注解。而Entity則是注解的名字。通常在文件中,寫法如下

public @interface Entity {  } 

注解元素

Java注解可以使用元素來進(jìn)行設(shè)置一些值,注解中的元素類似于屬性或者參數(shù)。定義包含元素的注解示例代碼

public @interface Entity {   String tableName(); } 

使用包含元素的注解示例代碼

@Entity(tableName = "vehicles") 

上述注解的元素名稱為tableName,設(shè)置的值為vehicles。沒有元素的注解不需要使用括號。

如果注解包含多個(gè)元素,使用方法如下

@Entity(tableName = "vehicles", primaryKey = "id") 

如果注解只有一個(gè)元素,通常我們的寫法是這樣的

@InsertNew(value = "yes") 

但是這種情況下,當(dāng)且僅當(dāng)元素名為value,我們也可以簡寫,即不需要填寫元素名value,效果如下

@InsertNew("yes") 

注解使用

注解可以用來修飾代碼中的這些元素

  • 接口
  • 方法
  • 方法參數(shù)
  • 屬性
  • 局部變量

一個(gè)完整的使用示例如下

@Entity
public class Vehicle {

    @Persistent
    protected String vehicleName = null;

    @Getter
    public String getVehicleName() {
        return this.vehicleName;
    }

    public void setVehicleName(@Optional vehicleName) {
        this.vehicleName = vehicleName;
    }

    public List addVehicleNameToList(List names) {

        @Optional
        List localNames = names;

        if(localNames == null) {
            localNames = new ArrayList();
        }
        localNames.add(getVehicleName());

        return localNames;
    }
}

內(nèi)置的Java注解

Java中有三種內(nèi)置注解,這些注解用來為編譯器提供指令。它們是

  • @Deprecated
  • @Override
  • @SuppressWarnings

@Deprecated

  • 可以用來標(biāo)記類,方法,屬性。
  • 如果上述三種元素不再使用,使用@Deprecated注解
  • 如果代碼使用了@Deprecated注解的類,方法或?qū)傩?,編譯器會進(jìn)行警告。

@Deprecated使用很簡單,如下為注解一個(gè)棄用的類。

@Deprecated 
public class MyComponent {

} 

當(dāng)我們使用@Deprecated注解后,建議配合使用對應(yīng)的@deprecated JavaDoc符號,并解釋說明為什么這個(gè)類,方法或?qū)傩员粭売茫呀?jīng)替代方案是什么。

@Deprecated
/**
  @deprecated This class is full of bugs. Use MyNewComponent instead.
*/
public class MyComponent {

}

@Override

@Override注解用來修飾對父類進(jìn)行重寫的方法。如果一個(gè)并非重寫父類的方法使用這個(gè)注解,編譯器將提示錯(cuò)誤。

實(shí)際上在子類中重寫父類或接口的方法,@Overide并不是必須的。但是還是建議使用這個(gè)注解,在某些情況下,假設(shè)你修改了父類的方法的名字,那么之前重寫的子類方法將不再屬于重寫,如果沒有@Overide,你將不會察覺到這個(gè)子類的方法。有了這個(gè)注解修飾,編譯器則會提示你這些信息。

使用Override注解的例子

public class MySuperClass {

    public void doTheThing() {
        System.out.println("Do the thing");
    }
}

public class MySubClass extends MySuperClass{

    @Override
    public void doTheThing() {
        System.out.println("Do it differently");
    }
}

@SuppressWarnings

  • @SuppressWarnings用來抑制編譯器生成警告信息。
  • 可以修飾的元素為類,方法,方法參數(shù),屬性,局部變量

使用場景:當(dāng)我們一個(gè)方法調(diào)用了棄用的方法或者進(jìn)行不安全的類型轉(zhuǎn)換,編譯器會生成警告。我們可以為這個(gè)方法增加@SuppressWarnings注解,來抑制編譯器生成警告。

注意:使用@SuppressWarnings注解,采用就近原則,比如一個(gè)方法出現(xiàn)警告,我們盡量使用@SuppressWarnings注解這個(gè)方法,而不是注解方法所在的類。雖然兩個(gè)都能抑制編譯器生成警告,但是范圍越小越好,因?yàn)榉秶罅?,不利于我們發(fā)現(xiàn)該類下其他方法的警告信息。

使用示例

@SuppressWarnings public void methodWithWarning() { 

} 

創(chuàng)建自己的注解

在Java中,我們可以創(chuàng)建自己的注解,注解和類,接口文件一樣定義在自己的文件里面。如下

@interface MyAnnotation {
    String   value();
    String   name();
    int      age();
    String[] newNames();
}

上述代碼定義了一個(gè)叫做MyAnnotation的注解,它有4個(gè)元素。再次強(qiáng)調(diào)一下,@interface這個(gè)關(guān)鍵字用來告訴java編譯器這是一個(gè)注解。

仔細(xì)一看,你會發(fā)現(xiàn),注解元素的定義很類似于接口的方法。這些元素有類型和名稱。這些類型可以是

  • 原始數(shù)據(jù)類型
  • String
  • Class
  • annotation
  • 枚舉
  • 一維數(shù)組

如下為應(yīng)用自定義的注解

@MyAnnotation(
    value="123",
    name="Jakob",
    age=37,
    newNames={"Jenkov", "Peterson"}
)
public class MyClass {

}

注意,我們需要為所有的注解元素設(shè)置值,一個(gè)都不能少。

注解元素默認(rèn)值

對于注解中的元素,我們可以為其設(shè)置默認(rèn)值,使用方法為

@interface MyAnnotation {
    String   value() default "";
    String   name();
    int      age();
    String[] newNames();
}

上述代碼,我們設(shè)置了value元素的默認(rèn)值為空字符串。當(dāng)我們在使用時(shí),可以不設(shè)置value的值,即讓value使用空字符串默認(rèn)值。 使用示例代碼

@MyAnnotation(
    name="Jakob",
    age=37,
    newNames={"Jenkov", "Peterson"}
)
public class MyClass {

}

@Retention

@Retention是用來修飾注解的注解,使用這個(gè)注解,我們可以做到

  • 控制注解是否寫入class文件
  • 控制class文件中的注解是否在運(yùn)行時(shí)可見

控制很簡單,使用使用以下三種策略之一即可。

  • RetentionPolicy.SOURCE 表明注解僅存在源碼之中,不存在.class文件,更不能運(yùn)行時(shí)可見。常見的注解為@Override, @SuppressWarnings。
  • RetentionPolicy.CLASS 這是默認(rèn)的注解保留策略。這種策略下,注解將存在與.class文件,但是不能被運(yùn)行時(shí)訪問。通常這種注解策略用來處于一些字節(jié)碼級別的操作。
  • RetentionPolicy.RUNTIME 這種策略下可以被運(yùn)行時(shí)訪問到。通常情況下,我們都會結(jié)合反射來做一些事情。

@Retention的使用示例

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation {
    String   value() default "";
}

@Target

使用@Target注解,我們可以設(shè)定自定義注解可以修飾哪些java元素。簡單示例

import java.lang.annotation.ElementType;
import java.lang.annotation.Target;

@Target({ElementType.METHOD})
public @interface MyAnnotation {
    String   value();
}

上述的代碼說明MyAnnotation注解只能修飾方法。

@Target可以選擇的參數(shù)值有如下這些

  • ElementType.ANNOTATION_TYPE(注:修飾注解)
  • ElementType.CONSTRUCTOR
  • ElementType.FIELD
  • ElementType.LOCAL_VARIABLE
  • ElementType.METHOD
  • ElementType.PACKAGE
  • ElementType.PARAMETER
  • ElementType.TYPE(注:任何類型,即上面的的類型都可以修飾)

@Inherited

如果你想讓一個(gè)類和它的子類都包含某個(gè)注解,就可以使用@Inherited來修飾這個(gè)注解。

java.lang.annotation.Inherited

@Inherited
public @interface MyAnnotation {

}
@MyAnnotation 
public class MySuperClass { ... } 
public class MySubClass extends MySuperClass { ... } 

上述代碼的大致意思是

  • 使用@Inherited修飾注解MyAnnotation
  • 使用MyAnnotation注解MySuperClass
  • 實(shí)現(xiàn)一個(gè)類MySubclass繼承自MySuperClass

通過以上幾步,MySubClass也擁有了MyAnnotation注解。

關(guān)于Java中的注解,一些基本的概念就是這些。

總結(jié)

到此這篇關(guān)于Java中注解(Annotation)的文章就介紹到這了,更多相關(guān)Java注解使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java自帶命令行工具jmap、jhat與jinfo的使用實(shí)例代碼詳解

    java自帶命令行工具jmap、jhat與jinfo的使用實(shí)例代碼詳解

    本篇文章主要通過代碼實(shí)例對java自帶命令行工具jmap、jhat與jinfo的使用做出了詳解,需要的朋友可以參考下
    2017-04-04
  • Java IO流之字節(jié)輸入流的使用詳解

    Java IO流之字節(jié)輸入流的使用詳解

    這篇文章主要為大家詳細(xì)介紹了Java IO流中字節(jié)輸入流的使用,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Java有一定的幫助,需要的可以參考一下
    2022-08-08
  • java實(shí)現(xiàn)Socket通信之單線程服務(wù)

    java實(shí)現(xiàn)Socket通信之單線程服務(wù)

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)Socket通信的單線程服務(wù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • SpringBoot+MyBatisPlus+Vue 前后端分離項(xiàng)目快速搭建過程(前端篇)

    SpringBoot+MyBatisPlus+Vue 前后端分離項(xiàng)目快速搭建過程(前端篇)

    這篇文章主要介紹了SpringBoot+MyBatisPlus+Vue 前后端分離項(xiàng)目快速搭建過程(前端篇),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-05-05
  • 深入理解Java顯式鎖的相關(guān)知識

    深入理解Java顯式鎖的相關(guān)知識

    今天帶大家學(xué)習(xí)的是關(guān)于Java的相關(guān)知識,文章圍繞著Java顯式鎖展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • Spring Cloud Zuul自定義過濾器的實(shí)現(xiàn)

    Spring Cloud Zuul自定義過濾器的實(shí)現(xiàn)

    這篇文章主要介紹了自定義Spring Cloud Zuul過濾器的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Java中的ReentrantReadWriteLock使用詳解

    Java中的ReentrantReadWriteLock使用詳解

    這篇文章主要介紹了Java中的ReentrantReadWriteLock使用詳解,ReentrantReadWriteLock是Java中的一個(gè)鎖實(shí)現(xiàn),它提供了讀寫分離的功能,這種讀寫分離的機(jī)制可以提高并發(fā)性能,特別適用于讀多寫少的場景,需要的朋友可以參考下
    2023-11-11
  • 模仿百度紅包福袋界面實(shí)例代碼

    模仿百度紅包福袋界面實(shí)例代碼

    新年到新年到,紅包搶不停。在我搶紅包的時(shí)候意外的發(fā)現(xiàn)了百度的福袋界面挺不錯(cuò)的,于是抽時(shí)間專門寫篇文章來完成百度紅包界面吧
    2016-02-02
  • Java中的@PreAuthorize注解源碼解析

    Java中的@PreAuthorize注解源碼解析

    這篇文章主要介紹了Java中的@PreAuthorize注解源碼解析,@PreAuthorize注解會在方法執(zhí)行前進(jìn)行權(quán)限驗(yàn)證,支持Spring?EL表達(dá)式,它是基于方法注解的權(quán)限解決方案,需要的朋友可以參考下
    2023-10-10
  • java的正則表達(dá)式你知道多少

    java的正則表達(dá)式你知道多少

    這篇文章主要為大家詳細(xì)介紹了java的正則表達(dá)式,使用表格進(jìn)行介紹,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02

最新評論