注解,反射,動(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)的處理邏輯。
注解的分類:
- JDK內(nèi)置系統(tǒng)注解
- 元注解
- 自定義注解
JDK內(nèi)置系統(tǒng)的注解
- @Override:用于修飾此方法覆蓋了父類的方法;
- @Deprecated:用于修飾已經(jīng)過時(shí)的方法;
- @SuppressWarnnings:用于通知java編譯器禁止特定的編譯警告。
元注解
元注解可以理解為注解的注解。元注解的作用就是負(fù)責(zé)注解其他注解
可以看到@Override注解就有元注解在修飾標(biāo)注。

元注解在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í)的邏輯處理

@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類的方法,即反射。
- <T extends Annotation> T getAnnotation(Class<T> annotationClass): 返回改程序元素上存在的、指定類型的注解,如果該類型注解不存在,則返回null。
- Annotation[] getAnnotations():返回該程序元素上存在的所有注解。
- boolean is AnnotationPresent(Class<?extends Annotation> annotationClass):判斷該程序元素上是否包含指定類型的注解,存在則返回true,否則返回false.
- 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