java注解

注解,反射,動(dòng)態(tài)代理?;究蚣芏紩?huì)用到的基本原理。
先看下注解:

什么是注解:

Java提供了一種元程序中的元素關(guān)聯(lián)任何信息和著任何元數(shù)據(jù)(metadata)的途徑和方法,這是比較官方標(biāo)準(zhǔn)的定義。

通俗些就是java提供的一個(gè)能標(biāo)記的能力。
最常見的用途,就是各種框架里,通過反射來獲取指定程序元素的Annotion對象,然后判斷Annotion對象類型或者Annotion里的元數(shù)據(jù),來做對應(yīng)的處理邏輯。

注解的分類:
  1. JDK內(nèi)置系統(tǒng)注解
  2. 元注解
  3. 自定義注解
JDK內(nèi)置系統(tǒng)的注解
  • @Override:用于修飾此方法覆蓋了父類的方法;
  • @Deprecated:用于修飾已經(jīng)過時(shí)的方法;
  • @SuppressWarnnings:用于通知java編譯器禁止特定的編譯警告。
元注解

元注解可以理解為注解的注解。元注解的作用就是負(fù)責(zé)注解其他注解
可以看到@Override注解就有元注解在修飾標(biāo)注。

image.png

元注解在jdk的lang.annotation包下能看到。jdk1.5提供了4個(gè)元注解。

@Target
用于描述注解的使用范圍(即:被描述的注解可以用在什么地方)
比如:METHOD:用于描述方法,上邊截圖的Override注解就只能作用在方法上。TYPE:用于描述類、接口(包括注解類型) 或enum聲明,ElementType類有注釋

@Retention
表示需要在什么級別保存該注釋信息,用于描述注解的生命周期(即:被描述的注解在什么范圍內(nèi)有效)。RetentionPolicy類有注釋
1.SOURCE:在源文件中有效(即源文件保留)
2.CLASS:在class文件中有效(即class保留)
3.RUNTIME:在運(yùn)行時(shí)有效(即運(yùn)行時(shí)保留)
比如上邊截圖的Override只是在源文件中有效,是為了保證編譯正確使用的注解。
而sping的Controller注解就是在運(yùn)行時(shí)有效,這樣注解處理器可以通過反射,獲取到該注解的屬性值,從而去做一些運(yùn)行時(shí)的邏輯處理

image.png

@Documented,@Inherited暫時(shí)沒有使用,等使用到了,再來補(bǔ)充。

自定義注解

@interface關(guān)鍵字,java實(shí)現(xiàn)自定義注解的語法。

使用@interface自定義注解時(shí),自動(dòng)繼承了java.lang.annotation.Annotation接口,由編譯程序自動(dòng)完成其他細(xì)節(jié)。在定義注解時(shí),不能繼承其他的注解或接口。@interface用來聲明一個(gè)注解,其中的每一個(gè)方法實(shí)際上是聲明了一個(gè)配置參數(shù)。方法的名稱就是參數(shù)的名稱,返回值類型就是參數(shù)的類型(返回值類型只能是基本類型、Class、String、enum)。

比如實(shí)現(xiàn)一個(gè)自定義注解,web控制器標(biāo)記:

package com.lxqn.jiapeng.spring.annotation;

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

/**
 * Web控制器標(biāo)記
 * @author jiapeng
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Controller {
}
注解信息的獲取

提供了標(biāo)記的能力,目的還是獲取這些注解信息。獲取主要用的是Class類的方法,即反射。

  1. <T extends Annotation> T getAnnotation(Class<T> annotationClass): 返回改程序元素上存在的、指定類型的注解,如果該類型注解不存在,則返回null。
  2. Annotation[] getAnnotations():返回該程序元素上存在的所有注解。
  3. boolean is AnnotationPresent(Class<?extends Annotation> annotationClass):判斷該程序元素上是否包含指定類型的注解,存在則返回true,否則返回false.
  4. Annotation[] getDeclaredAnnotations():返回直接存在于此元素上的所有注釋。與此接口中的其他方法不同,該方法將忽略繼承的注釋。(如果沒有注釋直接存在于此元素上,則返回長度為零的一個(gè)數(shù)組。)該方法的調(diào)用者可以隨意修改返回的數(shù)組;這不會(huì)對其他調(diào)用者返回的數(shù)組產(chǎn)生任何影響。
    例子:

參考文章:
http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html
jdk1.8
spring-context-3.2.10

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容