淺談Java自定義註解相關知識

一、自定義註解格式

分析 Java 中自帶的 @Override 註解 , 源碼如下 :

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}

註解分為兩部分 :

① 元註解 ;

② public @interface 註解名稱 ;

二、註解本質分析

按照 public @interface 註解名稱 格式 , 寫出一個註解 , 編譯該註解代碼生成 Annotation.class 字節碼文件 ;

public @interface Annotation {
}

使用 javap 命令反編譯Annotation.class 字節碼文件 , 查看該註解的實際代碼 ;

反編譯命令如下 :

javap Annotation.class

輸出內容 :

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 {
}

在這裡插入圖片描述

註解的本質是一個 interface 接口 , 註解接口默認繼承瞭 java.lang.annotation.Annotation 接口 ;

public interface Annotation extends java.lang.annotation.Annotation {
}

三、註解屬性及類型

註解的本質是接口 , 接口中可以定義 常量 和 方法 ;

在註解中定義 接口方法 , 就是 註解的屬性 ;

為註解添加屬性 : 接口中的方法都是抽象方法 , 其中 public abstract 可以省略 ;

public @interface Annotation {
    public abstract String path();
}

註解屬性使用格式 :

@註解名稱(屬性名稱 = 屬性值)

註解屬性使用 : 在相關的代碼上使用

 @Annotation(path = "")
    Student(String name, int age){
    }

四、註解屬性類型

註解屬性 ( 接口方法 ) 返回值類型要求 :

① 基本數據類型 : byte , short , int , long , float , double , char , boolean ;

② 字符串類型 : String ;

③ 枚舉類型 : enum ;

④ 註解類型 ;

⑤ 以上類型的數組形式 ;

註解屬性返回值必須是以上的類型 , 不能設置其它類型返回值 , 否則會報錯 ;

註解中定義瞭屬性 , 在使用註解時 , 需要 給 註解屬性 賦值 ;

定義 註解屬性 時 , 可以 使用 default 關鍵字 指定屬性默認值 , 下面代碼中 , 制定 註解屬性 intValue 值類型為 int 整型 , 默認值 88 ;

int intValue() default 88;

如果 註解屬性 指定瞭默認值 , 在使用註解時 , 可以選擇 不為該屬性賦值 ( 此時使用默認屬性值 ) , 也可以進行賦值 ( 指定一個新的屬性值 ) ;

如果 註解屬性 沒有指定默認值 , 則使用 註解 時 , 必須為其指定一個默認值 , 否則編譯時報錯 ;

數組類型 的 註解屬性 賦值 時 , 使用大括號進行賦值 , 大括號內是數組元素 , 如果隻有一個屬性 , 可以省略大括號 ,

註解 聲明示例 :

public @interface Annotation {
    /**
     * 字符串類型
     * @return
     */
    String stringValue();

    /**
     * int 基本類型
     * @return
     */
    int intValue() default 88;

    /**
     * 枚舉類型
     * @return
     */
    Number enumValue();

    /**
     * 註解類型
     * @return
     */
    Annotation2 annotationValue();

    /**
     * 字符串數組類型
     * @return
     */
    String[] stringArrayValue();
}

枚舉類 :

public enum Number {
    ONE, TWO, THREE
}

Annotation2 註解類 :

public @interface Annotation2 {
}

註解使用示例 :

/**
 * 註解生成文檔
 *
 * @author hsl
 * @version  0.1
 * @since 1.5
 */
public class Student {
    /**
     * 構造函數
     * @param name 參數一
     * @param age 參數二
     */
    @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();
    }
}

代碼分析 : 重點關註註解的使用 , 使用註解時 , 需要給 沒有默認值 的 註解屬性 賦值 , 格式為 註解屬性名稱 = 對應類型屬性值 , 如果 註解屬性 有默認值 , 則

@Annotation(stringValue = "tom", enumValue = Number.ONE, stringArrayValue = {"tom", "jerry"})

五、註解屬性賦值簡化操作

如果 註解屬性 名稱是 value , 並且 註解中隻有 1 1 1 個屬性 , 那麼在使用 註解 為 註解屬性 賦值時 , 可以省略註解名稱 , 直接傳入 註解屬性值 ;

示例 : JDK 自帶的 SuppressWarnings 註解 ,

@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
    String[] value();
}

註解使用 : 使用 SuppressWarnings 註解時 , 直接傳入 “all” 參數 , 省略瞭註解屬性名稱 ;

 @SuppressWarnings("all")
    @Override
    public String toString() {
        return super.toString();
    }

滿足兩個條件 , 才能使用上述簡化方式 ;

到此這篇關於淺談Java自定義註解相關知識的文章就介紹到這瞭,更多相關Java自定義註解內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: