您好,登錄后才能下訂單哦!
這篇文章給大家介紹如何在Java中自定義注解,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
分析 Java 中自帶的 @Override
注解 , 源碼如下 :
@Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) public @interface Override { }
注解分為兩部分 :
① 元注解 ;
② public @interface 注解名稱 ;
按照 public @interface 注解名稱
格式 , 寫出一個(gè)注解 , 編譯該注解代碼生成 Annotation.class 字節(jié)碼文件 ;
public @interface Annotation { }
使用 javap 命令反編譯Annotation.class 字節(jié)碼文件 , 查看該注解的實(shí)際代碼 ;
反編譯命令如下 :
javap Annotation.class
輸出內(nèi)容 :
D:\002_Project\004_Java_Learn\Annotation\out\production\Annotation>javap Annotation.class Compiled from "Annotation.java" public interface Annotation extends java.lang.annotation.Annotation { }
注解的本質(zhì)是一個(gè) interface 接口 , 注解接口默認(rèn)繼承了 java.lang.annotation.Annotation 接口 ;
public interface Annotation extends java.lang.annotation.Annotation { }
注解的本質(zhì)是接口 , 接口中可以定義 常量 和 方法 ;
在注解中定義 接口方法 , 就是 注解的屬性 ;
為注解添加屬性 : 接口中的方法都是抽象方法 , 其中 public abstract 可以省略 ;
public @interface Annotation { public abstract String path(); }
注解屬性使用格式 :
@注解名稱(屬性名稱 = 屬性值)
注解屬性使用 : 在相關(guān)的代碼上使用
@Annotation(path = "") Student(String name, int age){ }
注解屬性 ( 接口方法 ) 返回值類型要求 :
① 基本數(shù)據(jù)類型 : byte , short , int , long , float , double , char , boolean ;
② 字符串類型 : String ;
③ 枚舉類型 : enum ;
④ 注解類型 ;
⑤ 以上類型的數(shù)組形式 ;
注解屬性返回值必須是以上的類型 , 不能設(shè)置其它類型返回值 , 否則會(huì)報(bào)錯(cuò) ;
注解中定義了屬性 , 在使用注解時(shí) , 需要 給 注解屬性 賦值 ;
定義 注解屬性 時(shí) , 可以 使用 default 關(guān)鍵字 指定屬性默認(rèn)值 , 下面代碼中 , 制定 注解屬性 intValue 值類型為 int 整型 , 默認(rèn)值 88 ;
int intValue() default 88;
如果 注解屬性 指定了默認(rèn)值 , 在使用注解時(shí) , 可以選擇 不為該屬性賦值 ( 此時(shí)使用默認(rèn)屬性值 ) , 也可以進(jìn)行賦值 ( 指定一個(gè)新的屬性值 ) ;
如果 注解屬性 沒有指定默認(rèn)值 , 則使用 注解 時(shí) , 必須為其指定一個(gè)默認(rèn)值 , 否則編譯時(shí)報(bào)錯(cuò) ;
數(shù)組類型 的 注解屬性 賦值 時(shí) , 使用大括號進(jìn)行賦值 , 大括號內(nèi)是數(shù)組元素 , 如果只有一個(gè)屬性 , 可以省略大括號 ,
注解 聲明示例 :
public @interface Annotation { /** * 字符串類型 * @return */ String stringValue(); /** * int 基本類型 * @return */ int intValue() default 88; /** * 枚舉類型 * @return */ Number enumValue(); /** * 注解類型 * @return */ Annotation2 annotationValue(); /** * 字符串?dāng)?shù)組類型 * @return */ String[] stringArrayValue(); }
枚舉類 :
public enum Number { ONE, TWO, THREE }
Annotation2 注解類 :
public @interface Annotation2 { }
注解使用示例 :
/** * 注解生成文檔 * * @author hsl * @version 0.1 * @since 1.5 */ public class Student { /** * 構(gòu)造函數(shù) * @param name 參數(shù)一 * @param age 參數(shù)二 */ @Annotation( stringValue = "tom", enumValue = Number.ONE, annotationValue = @Annotation2, stringArrayValue = {"tom", "jerry"}) Student(String name, int age){ } @SuppressWarnings("all") @Override public String toString() { return super.toString(); } }
代碼分析 : 重點(diǎn)關(guān)注注解的使用 , 使用注解時(shí) , 需要給 沒有默認(rèn)值 的 注解屬性 賦值 , 格式為 注解屬性名稱 = 對應(yīng)類型屬性值
, 如果 注解屬性 有默認(rèn)值 , 則
@Annotation(stringValue = "tom", enumValue = Number.ONE, stringArrayValue = {"tom", "jerry"})
如果 注解屬性 名稱是 value , 并且 注解中只有 1 1 1 個(gè)屬性 , 那么在使用 注解 為 注解屬性 賦值時(shí) , 可以省略注解名稱 , 直接傳入 注解屬性值 ;
示例 : JDK 自帶的 SuppressWarnings 注解 ,
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE}) @Retention(RetentionPolicy.SOURCE) public @interface SuppressWarnings { String[] value(); }
注解使用 : 使用 SuppressWarnings 注解時(shí) , 直接傳入 “all” 參數(shù) , 省略了注解屬性名稱 ;
@SuppressWarnings("all") @Override public String toString() { return super.toString(); }
Java主要應(yīng)用于:1. web開發(fā);2. Android開發(fā);3. 客戶端開發(fā);4. 網(wǎng)頁開發(fā);5. 企業(yè)級應(yīng)用開發(fā);6. Java大數(shù)據(jù)開發(fā);7.游戲開發(fā)等。
關(guān)于如何在Java中自定義注解就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。