天天看點

java自定義注解學習(二)_注解詳解

上篇文章,我們簡單的實作了一個自定義注解,相信大家對自定義注解有了個簡單的認識,這篇,這樣介紹下注解中的元注解和内置注解

整體圖示

java自定義注解學習(二)_注解詳解

内置注解

@Override 重寫覆寫

這個注解大家應該經常用到,主要在子類重寫父類的方法,比如

toString()

方法

package com.kevin.demo;

public class Demo1 {

    @Override
    public String toString(){
        return "demo1";
    }
}
           

@Deprecated 過時

@Deprecated

可以修飾的範圍很廣,包括類、方法、字段、參數等,它表示對應的代碼已經過時了,程式員不應該使用它,不過,它是一種警告,而不是強制性的。

package com.kevin.demo;

public class Demo1 {

    @Deprecated
    public void goHome(){
        System.out.println("過時的方法");
    }
}
           

idea中調用這些方法,編譯器也會顯示删除線并警告

@SuppressWarning 壓制Java的編譯警告

@SuppressWarnings

表示壓制Java的編譯警告,它有一個必填參數,表示壓制哪種類型的警告.

| 關鍵字| 用途|

| -------- | :----- |

| all | to suppress all warnings

|boxing | to suppress warnings relative to boxing/unboxing operations

| cast | to suppress warnings relative to cast operations

| dep-ann | to suppress warnings relative to deprecated annotation

| deprecation | to suppress warnings relative to deprecation

| fallthrough | to suppress warnings relative to missing breaks in switch statements

| finally | to suppress warnings relative to finally block that don¡¯t return

| hiding | to suppress warnings relative to locals that hide variable

| incomplete-switch | to suppress warnings relative to missing entries in a switch statement (enum case)

|nls | to suppress warnings relative to non-nls string literals

|null | to suppress warnings relative to null analysis

| rawtypes | to suppress warnings relative to un-specific types when using generics on class params

| restriction | to suppress warnings relative to usage of discouraged or forbidden references

| serial | to suppress warnings relative to missing serialVersionUID field for a serializable class

|static-access | to suppress warnings relative to incorrect static access

| synthetic-access | to suppress warnings relative to unoptimized access from inner classes

| unchecked | to suppress warnings relative to unchecked operations

| unqualified-field-access | to suppress warnings relative to field access unqualified

| unused | to suppress warnings relative to unused code

上面的方法,我們就可以增加

@SuppressWarnings("deprecation")
    public static void main(String[] args) {
        Demo1 demo1 = new Demo1();
        demo1.goHome();
    }           

元注解

元注解:注解的注解,即java為注解開發特準備的注解。

我們以上面講到的java内置注解@Override為例,學習下java元注解

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

@Target

@Target

表示注解的目标,

@Override

的目标是方法(

ElementType.METHOD

),

ElementType

是一個枚舉,其他可選值有:

  • TYPE:表示類、接口(包括注解),或者枚舉聲明
  • FIELD:字段,包括枚舉常量
  • METHOD:方法
  • PARAMETER:方法中的參數
  • CONSTRUCTOR:構造方法
  • LOCAL_VARIABLE:本地變量
  • ANNOTATION_TYPE:注解類型
  • PACKAGE:包

目标可以有多個,用{}表示,比如

@SuppressWarnings

@Target

就有多個,定義為:

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

如果沒有聲明

@Target

,預設為适用于所有類型。我們上篇文章的demo就沒有聲明

@Target

@Retention

@Retention

表示注解資訊保留到什麼時候,取值隻能有一個,類型為

RetentionPolicy

,它是一個枚舉,有三個取值:

  • SOURCE

    :隻在源代碼中保留,編譯器将代碼編譯為位元組碼檔案後就會丢掉
  • CLASS

    :保留到位元組碼檔案中,但Java虛拟機将class檔案加載到記憶體時不一定會在記憶體中保留
  • RUNTIME

    :一直保留到運作時

@Retention

,預設為

CLASS

@Override

@SuppressWarnings

都是給編譯器用的,是以

@Retention

都是

RetentionPolicy.SOURCE

@Documented

用于指定javadoc生成API文檔時顯示該注解資訊。

Documented

是一個标記注解,沒有成員。

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Documented {
}           

@Inherited

@Inherited

元注解是一個标記注解,@Inherited闡述了某個被标注的類型是被繼承的。

看個栗子

public class Demo1 {

        @Inherited
        @Retention(RetentionPolicy.RUNTIME)
        static @interface Test {
        }

        @Test
        static class Base {
        }

        static class Child extends Base {
        }

        public static void main(String[] args) {
            System.out.println(Child.class.isAnnotationPresent(Test.class));
        }

}           

main

方法檢查

Child

類是否有Test注解,輸出為

true

,這是因為

Test

有注解

@Inherited

,如果去掉,輸出就變成

false

總結

好了,這篇先學習到這,我要好好看看這些知識,下篇介紹注解的解析啦。好了。玩的開心!

參考