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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

[转] Java @interface 自定义注解

發(fā)布時間:2025/3/15 java 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [转] Java @interface 自定义注解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

[From]?http://blog.csdn.net/afterlife_qiye/article/details/53748973

?

1. 注解的好處

注解可以替代配置文件完成對某些功能的描述,減少程序配置;

在沒有配置文件的情況下,我們?nèi)ビ^察代碼,并不需要同時打開兩個文件來觀察這個字段到底對應(yīng)數(shù)據(jù)庫的哪個列,減少了程序繁瑣性,使得代碼更加清晰易懂;

目前市面上流行的框架基本上都包含了注解配置,那么針對于開源項目,我們在閱讀項目代碼時,不懂注解如何實現(xiàn),真的是舉步難堅,所以,學(xué)習(xí)注解也可以加強我們對開源項目源碼的解讀。

?

2. Java自帶注解

?

注解是Java1.5,JDK5.0引用的技術(shù),與類,接口,枚舉處于同一層次?。它可以聲明在包、類、字段、方法、局部變量、方法參數(shù)等的前面,用來對這些元素進(jìn)行說明,注釋?。

Java中,自帶了三種注解,這三種注解存在于java.lang包中,首先我們講一講這些注解

?Override

它的作用是對覆蓋超類中方法的方法進(jìn)行標(biāo)記,如果被標(biāo)記的類并沒有實際覆蓋超類,則編譯器會發(fā)出錯誤警告。?

很常見的一個注解,了解JavaOOP的小伙伴這個注解應(yīng)該較為常用,告訴編譯器,我這個方法是重寫了父類方法,當(dāng)然如果你的方法并沒有實際重寫父類方法時,那么編譯器就會顯示警告信息

?Deprecated

它的作用是對不應(yīng)該再使用的方法添加注解,當(dāng)編程人員使用這些方法時,將會在編譯時顯示提示信息?

當(dāng)一個方法名或者類名上面此注解之后,編譯器會認(rèn)為這個方法屬于過期方法,明顯的區(qū)別在于類名或者方法名上會畫一道刪除線,標(biāo)識過期方法不影響方法的繼續(xù)使用

?SuppressWarnings

這個僅僅是告訴編譯器忽略特定的警告信息,例如在泛型中使用原生數(shù)據(jù)類型?

例如我們在使用一些以Deprecated注解的方法時,編譯器會提出黃線警告,那么只要在使用的地方加上@SuppressWarnings(“deprecation”)就可以使編譯器忽略這個警告?

此注釋常用的參數(shù)值有?:

? deprecation(忽略使用過時類或者方法)

? unchecked(忽略執(zhí)行了未檢查裝換時警告)?

? fallthrough(忽略switch直接指向到下一個case塊沒有break警告)

? path(忽略類路徑,源文件路徑中有不存在路徑時警告)

? serial(忽略可序列化類中沒有serialVersionUID時的警告)

? finally(任何finally不能正常執(zhí)行時的警告)

? all(以上所有)

?

?

3. 自定義注解須知

首先,自定義注解我們必須了解四個元注解,什么是元注解?元注解指作用于注解之上的元數(shù)據(jù)或者元信息,簡單通俗的講,元注解就是注解的注解?.

Documented與Inherited是典型的標(biāo)識性注解,也就是說在注解內(nèi)部并沒有成員變量,沒有成員變量的注解稱為標(biāo)識注解?

?Documented

指明擁有這個注解的元素可以被javadoc此類的工具文檔化。這種類型應(yīng)該用于注解那些影響客戶使用帶注釋的元素聲明的類型。如果一種聲明使用Documented進(jìn)行注解,這種類型的注解被作為被標(biāo)注的程序成員的公共API?。

?Inherited

指明該注解類型被自動繼承。如果用戶在當(dāng)前類中查詢這個元注解類型并且當(dāng)前類的聲明中不包含這個元注解類型,那么也將自動查詢當(dāng)前類的父類是否存在Inherited元注解,這個動作將被重復(fù)執(zhí)行知道這個標(biāo)注類型被找到,或者是查詢到頂層的父類。

?Retention

指明在什么級別顯示此注解

?

Retention主要的參數(shù)類型包括以下幾種:

RetentionPolicy.SOURCE?注解存在于源代碼中,編譯時會被拋棄

RetentionPolicy.CLASS?注解會被編譯到class文件中,但是JVM會忽略

RetentionPolicy.RUNTIME JVM會讀取注解,同時會保存到class文件中

?

?Target

指明該類型的注解可以注解的程序元素的范圍

?

?

Target主要的參數(shù)類型包括以下幾種:

ElementType.TYPE?用于類,接口,枚舉但不能是注解

ElementType.FIELD?作用于字段,包含枚舉值

ElementType.METHOD?作用于方法,不包含構(gòu)造方法

ElementType.PARAMETER?作用于方法的參數(shù)

ElementType.CONSTRUCTOR?作用于構(gòu)造方法

ElementType.LOCAL_VERIABLE?作用于本地變量或者catch語句

ElementType.ANNOTATION_TYPE?作用于注解

ElementType.PACKAGE?作用于包

?

4. 實例應(yīng)用

?注解的定義

@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) //類上的注解 public @interface ClassAnnotation { String value() default "I am Class Annotation"; }

?

@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) //屬性上的注解 public @interface FieldAnnotation { String value() default "I am Field Annotation"; String operate() default "operate"; }

?

@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) //方法上的注解 public @interface MethodAnnotation { String value() default "I am Method Annotation"; String name() default "laobo"; }

?

@interface?用于定義注解接口,接口中只能定義成員變量,且定義的成員變量必須以()結(jié)尾,可以使用default關(guān)鍵字為成員變量指定默認(rèn)值,如果不為成員變量指定默認(rèn)值的情況,則必須在引用注解時,對沒有默認(rèn)值的成員變量進(jìn)行賦值操作

注解的使用規(guī)則

?

//@注解名(變量1=變量1值,變量2=變量2值,...)

//如果注解中擁有數(shù)組類型,假設(shè)是String類型,那么賦值方式可以如下

//@注解名(String數(shù)組名稱={"tset1","test2","test3"})

//如果我們的注解中只有一個成員變量,且成員變量的名稱為value()

//那么可以使用如下賦值方式

//@注解名(屬性值)

//如果我們的注解中沒有成員變量,那么此時的注解被稱為標(biāo)識注解 ?

?注解的使用

@ClassAnnotation //類上注解 public class TestAnnotation { //屬性注解 @FieldAnnotation(value = "老伯", operate = "啥都不干!") public String operate; //方法注解 @MethodAnnotation(value = "好人", name = "老伯") public void testMethod(){ System.out.println("這個測試方法!"); } }

?

?解析注解

主要使用Java的反射原理實現(xiàn)對注解的解析

public class Test { public static void main(String[] args) throws ClassNotFoundException { Class clazz = Class.forName("com.java._interface.blog.TestAnnotation"); Method[] methods = clazz.getMethods(); boolean flag = clazz.isAnnotationPresent(ClassAnnotation.class); if(flag){ ClassAnnotation classAnnotation = (ClassAnnotation) clazz.getAnnotation(ClassAnnotation.class); System.out.println(classAnnotation.value()); } boolean methodFlag = methods[0].isAnnotationPresent(MethodAnnotation.class); if(methodFlag){ MethodAnnotation methodAnnotation = (MethodAnnotation) methods[0].getAnnotation(MethodAnnotation.class); System.out.println(methodAnnotation.name() + methodAnnotation.value()); } Field[] fields = clazz.getDeclaredFields(); boolean fieldFlag = fields[0].isAnnotationPresent(FieldAnnotation.class); if(fieldFlag){ FieldAnnotation fieldAnnotation = fields[0].getAnnotation(FieldAnnotation.class); System.out.println(fieldAnnotation.value()); } } }

?

轉(zhuǎn)載于:https://www.cnblogs.com/pekkle/p/8529320.html

與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖

總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。