日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

详解Java中的注解

發布時間:2025/3/21 java 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 详解Java中的注解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

注解可以做什么

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

  • 編譯器指令
  • 構建時指令
  • 運行時指令

其中

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

注解基礎

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


public?@interface?Entity?{?}

注解元素

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


public?@interface?Entity?{?String?tableName();}

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

?@Entity(tableName?=?"vehicles")

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

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


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

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


@InsertNew(value?=?"yes")

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

?@InsertNew("yes")

注解使用

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

  • 接口
  • 方法
  • 方法參數
  • 屬性
  • 局部變量

一個完整的使用示例如下

@Entitypublic class Vehicle { @Persistent protected StringvehicleName = null; @Getter public String getVehicleName() { return this.vehicleName; } public void setVehicleName(@OptionalvehicleName) { this.vehicleName = vehicleName;} public ListaddVehicleNameToList(List names) {@OptionalList localNames =names; if(localNames == null) {localNames = new ArrayList(); }localNames.add(getVehicleName());return localNames; } }



內置的Java注解

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

  • @Deprecated
  • @Override
  • @SuppressWarnings

@Deprecated

  • 可以用來標記類,方法,屬性。
  • 如果上述三種元素不再使用,使用@Deprecated注解
  • 如果代碼使用了@Deprecated注解的類,方法或屬性,編譯器會進行警告。

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

@Deprecatedpublic class MyComponent {}
//當我們使用@Deprecated注解后,建議配合使用對應的@deprecated JavaDoc符號,并解釋說明為什么這個類,方法或屬性被棄用,已經替代方案是什么。 @Deprecated /** @deprecated This class is full of bugs. Use MyNewComponent instead.*/ public class MyComponent {}



@Override

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

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

使用Override注解的例子

public class MySuperClass { public void doTheThing() {System.out.println("Do the thing"); } } public class MySubClassextends MySuperClass{ @Override public void doTheThing() {System.out.println("Do it differently"); } }



@SuppressWarnings

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

使用場景:當我們一個方法調用了棄用的方法或者進行不安全的類型轉換,編譯器會生成警告。我們可以為這個方法增加@SuppressWarnings注解,來抑制編譯器生成警告。

注意:使用@SuppressWarnings注解,采用就近原則,比如一個方法出現警告,我們盡量使用@SuppressWarnings注解這個方法,而不是注解方法所在的類。雖然兩個都能抑制編譯器生成警告,但是范圍越小越好,因為范圍大了,不利于我們發現該類下其他方法的警告信息。

使用示例

@SuppressWarningspublic void methodWithWarning() {}

創建自己的注解

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

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

上述代碼定義了一個叫做MyAnnotation的注解,它有4個元素。再次強調一下,@interface這個關鍵字用來告訴java編譯器這是一個注解。

仔細一看,你會發現,注解元素的定義很類似于接口的方法。這些元素有類型和名稱。這些類型可以是

  • 原始數據類型
  • String
  • Class
  • annotation
  • 枚舉
  • 一維數組

如下為應用自定義的注解

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

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

注解元素默認值

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

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

上述代碼,我們設置了value元素的默認值為空字符串。當我們在使用時,可以不設置value的值,即讓value使用空字符串默認值。 使用示例代碼

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

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

  • 控制注解是否寫入class文件
  • 控制class文件中的注解是否在運行時可見

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

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

@Retention的使用示例

import java.lang.annotation.Retention; importjava.lang.annotation.RetentionPolicy; @Retention(RetentionPolicy.RUNTIME) @interfaceMyAnnotation { String value() default ""; }





@Target

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


import java.lang.annotation.ElementType; importjava.lang.annotation.Target; @Target({ElementType.METHOD})public@interface MyAnnotation { String value(); }



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

@Target可以選擇的參數值有如下這些

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

@Inherited

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

java.lang.annotation.Inherited@Inheritedpublic @interfaceMyAnnotation {}@MyAnnotationpublic class MySuperClass { ... }public class MySubClass extends MySuperClass { ... }

上述代碼的大致意思是

  • 使用@Inherited修飾注解MyAnnotation
  • 使用MyAnnotation注解MySuperClass
  • 實現一個類MySubclass繼承自MySuperClass
  • 通過以上幾步,MySubClass也擁有了MyAnnotation注解。

    關于Java中的注解,一些基本的概念就是這些。

    總結

    以上是生活随笔為你收集整理的详解Java中的注解的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。