JAVA中如何定義自定義註解

瞭解註解

註解是Java1.5,JDK5.0引用的技術,與類,接口,枚舉處於同一層次 。它能夠聲明在包、類、字段、方法、局部變量、方法參數等的前面,用來對這些元素進行說明,註釋 。java

在Java中,自帶了三種註解,這三種註解存在於java.lang包中,首先咱們講一講這些註解spring

  • Override——它的做用是對覆蓋超類中方法的方法進行標記,若是被標記的類並無實際覆蓋超類,則編譯器會發出錯誤警告。 
    很常見的一個註解,瞭解JavaOOP的小夥伴這個註解應該較爲經常使用,告訴編譯器,我這個方法是重寫了父類方法,固然若是你的方法並無實際重寫父類方法時,那麼編譯器就會顯示警告信息
  • Deprecated——它的做用是對不該該再使用的方法添加註解,當編程人員使用這些方法時,將會在編譯時顯示提示信息 
    當一個方法名或者類名上面此註解以後,編譯器會認爲這個方法屬於過時方法,明顯的區別在於類名或者方法名上會畫一道刪除線,標識過時方法不影響方法的繼續使用
  • SuppressWarnings——這個僅僅是告訴編譯器忽略特定的警告信息,例如在泛型中使用原生數據類型 
    例如咱們在使用一些以Deprecated註解的方法時,編譯器會提出黃線警告,那麼只要在使用的地方加上@SuppressWarnings(「deprecation」)就可使編譯器忽略這個警告 
    此註釋經常使用的參數值有 : deprecation(忽略使用過期類或者方法),unchecked(忽略執行了未檢查裝換時警告) , fallthrough(忽略switch直接指向到下一個case塊沒有break警告),path(忽略類路徑,源文件路徑中有不存在路徑時警告),serial(忽略可序列化類中沒有serialVersionUID時的警告),finally(任何finally不能正常執行時的警告),all(以上全部)

自定義註解須知

首先,自定義註解咱們必須瞭解四個元註解,什麼是元註解?元註解指做用於註解之上的元數據或者元信息,簡單通俗的講,元註解就是註解的註解 .編程

  • Documented——指明擁有這個註解的元素能夠被javadoc此類的工具文檔化。這種類型應該用於註解那些影響客戶使用帶註釋的元素聲明的類型。若是一種聲明使用Documented進行註解,這種類型的註解被做爲被標註的程序成員的公共API 。
  • Inherited——指明該註解類型被自動繼承。若是用戶在當前類中查詢這個元註解類型而且當前類的聲明中不包含這個元註解類型,那麼也將自動查詢當前類的父類是否存在Inherited元註解,這個動做將被重複執行知道這個標註類型被找到,或者是查詢到頂層的父類。
  • Retention——指明在什麼級別顯示此註解
  • Target——指明該類型的註解能夠註解的程序元素的範圍

Documented與Inherited是典型的標識性註解,也就是說在註解內部並無成員變量,沒有成員變量的註解稱爲標識註解 
Target主要的參數類型包括如下幾種數組

  • ElementType.TYPE 用於類,接口,枚舉但不能是註解
  • ElementType.FIELD 做用於字段,包含枚舉值
  • ElementType.METHOD 做用於方法,不包含構造方法
  • ElementType.PARAMETER 做用於方法的參數
  • ElementType.CONSTRUCTOR 做用於構造方法
  • ElementType.LOCAL_VERIABLE 做用於本地變量或者catch語句
  • ElementType.ANNOTATION_TYPE 做用於註解
  • ElementType.PACKAGE 做用於包

Retention主要的參數類型包括如下幾種ide

  1. RetentionPolicy.SOURCE 註解存在於源代碼中,編譯時會被拋棄
  2. RetentionPolicy.CLASS 註解會被編譯到class文件中,可是JVM會忽略
  3. RetentionPolicy.RUNTIME JVM會讀取註解,同時會保存到class文件中

自定義註解工具

註解的定義spa

 

註解中能夠定義的數據類型是受到限制的,除了基本類型以外,String,Enums,Annotation,Class以及這些類型的數組 code

 

package com.deng.spring;

import org.springframework.context.annotation.Scope;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 用於指定該註解的做用範圍,能夠指定一個或者多個
 ElementType.TYPE 用於類,接口,枚舉但不能是註解
 ElementType.FIELD 做用於字段,包含枚舉值
 ElementType.METHOD 做用於方法,不包含構造方法
 ElementType.PARAMETER 做用於方法的參數
 ElementType.CONSTRUCTOR 做用於構造方法
 ElementType.LOCAL_VERIABLE 做用於本地變量或者catch語句
 ElementType.ANNOTATION_TYPE 做用於註解
 ElementType.PACKAGE 做用於包
 */
@Target({ElementType.TYPE,ElementType.METHOD})
/**
 * 定義該註解的做用域
 * RetentionPolicy.SOURCE 註解存在於源代碼中,編譯時會被拋棄
 RetentionPolicy.CLASS 註解會被編譯到class文件中,可是JVM會忽略
 RetentionPolicy.RUNTIME JVM會讀取註解,同時會保存到class文件中
 */
@Retention(RetentionPolicy.RUNTIME)
//@interface定義註解的關鍵詞
//註解的名稱爲Animal
public @interface Animal {
    /**
     //定義成員變量  語法爲 數據類型 成員變量名() default 默認值;
     //成員變量能夠經過default指定默認值
     //若是成員變量不指定默認值的狀況下
     //咱們在使用註解時則必須給沒有默認值的成員變量賦值
     PS: 成員變量名爲value時,使用註解的時候能夠不指定成員變量名,直接設置一個值
     註解中成員變量能夠定義的數據類型是受到限制的,除了基本類型以外,String,
     Enums,Annotation,Class以及這些類型的數組
     */
    String value() ;
    public String color() ;

}

 

註解的使用blog

 

package com.deng.spring;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;

@Animal(value = "dog",color = "red")
public class Dog {

    private String name;


}

 

註解的解析繼承

 

Class c = Dog.class;
        Annotation[] as = c.getAnnotations();
        for(Annotation a : as){
            if(a instanceof  Animal){
                Animal am = (Animal)a;
                //獲取成員變量的值
                System.out.println("value = " + am.value());
                System.out.println("color = " + am.color());
            }
        }
相關文章
相關標籤/搜索