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

歡迎訪問 生活随笔!

生活随笔

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

java

自定义Java注解(一)

發布時間:2024/9/30 java 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 自定义Java注解(一) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

概念

注解是Java語言5.0版本開始支持加入源代碼的特殊語法元數據(描述數據的數據)有點像Class(描述類的類)

要自定義注解,必須先了解Java提供的幾個基本的元注解及其相關的語法

Java的幾個元注解

  • @Target
  • @Retention
  • @Inherited
  • @Documented

@Target

SourceCode

package java.lang.annotation; /*** Defines a meta-annotation for determining what {@link ElementType}s an* annotation can be applied to.** @since 1.5*/ @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Target {ElementType[] value(); }

@Target能夠指定注解作用的范圍,注解、構造器、域、局部變量、方法、包、參數、類、接口、枚舉它有以下8個值

ElementType備注
ANNOTATION_TYPE作用于注解類型
CONSTRUCTOR作用于構造器
FIELD作用于域
LOCAL_VARIABLE作用于局部變量
METHOD作用于方法
PACKAGE作用于包
PARAMETER作用于參數
TYPE作用于描述類、接口、枚舉


如果自定義的注解沒有指定@Target,默認該注解可以使用在上述所有范圍,如果存在@Target則編譯器會強制實施相應的使用規則,例如如果@Target指定是ANNOTATION_TYPE

@Target(ElementType.ANNOTATION_TYPE) public @interface MyAnnotation {...}

則MyAnnotation只能用在注解上,不能用在其他范圍

@MyAnnotation //right public @interface AnotherAnnotation{... }@MyAnnotation //compile error public class MyClass{.... }

如果要作用于多個范圍,使用大括號中間用逗號隔開,注意括號內不能存在相同的ElementType值否則編譯錯誤。eg如下

@Target({ElementType.TYPE,ElementType.METHOD}) public @interface MyAnnotation {...}

@Retention

SourceCode:

package java.lang.annotation;/*** Defines a meta-annotation for determining the scope of retention for an* annotation. If the retention annotation is not set {@code* RetentionPolicy.CLASS} is used as default retention.** @since 1.5*/ @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Retention {RetentionPolicy value(); }

@Retention指定注解的生命周期即保留的時間,如果未聲明@Retention默認使用的保留策略為RetentionPolicy.CLASS

RetentionPolicy備注
CLASS存在源文件、編譯的Class字節碼中,運行時VM不在保留
RUNTIME存在源文件、編譯的Class字節碼中,運行時VM會保存,且能通過反射獲取注解
SOURCE保留在源文件中,編譯器會丟棄

@Inherited

SourceCode:

package java.lang.annotation; /*** Defines a meta-annotation for indicating that an annotation is automatically* inherited.* @since 1.5*/ @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Inherited { }

分析源碼可知@Inherited只能修飾注解,它表示該注解類型被自動繼承,如果用戶在當前類中查詢這個元注解類型并且當前類的聲明中不包含這個元注解類型,那么也將自動查詢當前類的父類是否存在Inherited元注解,這個動作將被重復執行直到這個標注類型被找到,或者是查詢到頂層的父類

@Documented

SourceCode:

package java.lang.annotation; /*** Defines a meta-annotation for indicating that an annotation is documented and* considered part of the public API.* @since 1.5*/ @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Documented { }

@Documented:表示擁有該注解的元素可通過javadoc此類的工具進行文檔化。該類型應用于注解那些影響客戶使用帶注(comment)的元素聲明的類型。如果類型聲明是用Documented來注解的,這種類型的注解被作為被標注的程序成員的公共API


一個簡單應用注解的示例

總結

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

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