注解,反射浩销,動態(tài)代理痒留∏绰螅基本框架都會用到的基本原理。
先看下注解:
什么是注解:
Java提供了一種元程序中的元素關聯(lián)任何信息和著任何元數據(metadata)的途徑和方法伸头,這是比較官方標準的定義匾效。
通俗些就是java提供的一個能標記的能力。
最常見的用途恤磷,就是各種框架里面哼,通過反射來獲取指定程序元素的Annotion對象,然后判斷Annotion對象類型或者Annotion里的元數據扫步,來做對應的處理邏輯魔策。
注解的分類:
- JDK內置系統(tǒng)注解
- 元注解
- 自定義注解
JDK內置系統(tǒng)的注解
- @Override:用于修飾此方法覆蓋了父類的方法;
- @Deprecated:用于修飾已經過時的方法;
- @SuppressWarnnings:用于通知java編譯器禁止特定的編譯警告。
元注解
元注解可以理解為注解的注解锌妻。元注解的作用就是負責注解其他注解
可以看到@Override注解就有元注解在修飾標注代乃。
元注解在jdk的lang.annotation包下能看到。jdk1.5提供了4個元注解。
@Target
用于描述注解的使用范圍(即:被描述的注解可以用在什么地方)
比如:METHOD:用于描述方法搁吓,上邊截圖的Override注解就只能作用在方法上原茅。TYPE:用于描述類、接口(包括注解類型) 或enum聲明堕仔,ElementType類有注釋
@Retention
表示需要在什么級別保存該注釋信息擂橘,用于描述注解的生命周期(即:被描述的注解在什么范圍內有效)。RetentionPolicy類有注釋
1.SOURCE:在源文件中有效(即源文件保留)
2.CLASS:在class文件中有效(即class保留)
3.RUNTIME:在運行時有效(即運行時保留)
比如上邊截圖的Override只是在源文件中有效摩骨,是為了保證編譯正確使用的注解通贞。
而sping的Controller注解就是在運行時有效,這樣注解處理器可以通過反射恼五,獲取到該注解的屬性值昌罩,從而去做一些運行時的邏輯處理
@Documented,@Inherited暫時沒有使用灾馒,等使用到了茎用,再來補充。
自定義注解
@interface關鍵字睬罗,java實現自定義注解的語法轨功。
使用@interface自定義注解時,自動繼承了java.lang.annotation.Annotation接口容达,由編譯程序自動完成其他細節(jié)古涧。在定義注解時,不能繼承其他的注解或接口花盐。@interface用來聲明一個注解羡滑,其中的每一個方法實際上是聲明了一個配置參數。方法的名稱就是參數的名稱卒暂,返回值類型就是參數的類型(返回值類型只能是基本類型啄栓、Class、String也祠、enum)。
比如實現一個自定義注解近速,web控制器標記:
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控制器標記
* @author jiapeng
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Controller {
}
注解信息的獲取
提供了標記的能力诈嘿,目的還是獲取這些注解信息。獲取主要用的是Class類的方法削葱,即反射奖亚。
- <T extends Annotation> T getAnnotation(Class<T> annotationClass): 返回改程序元素上存在的、指定類型的注解析砸,如果該類型注解不存在昔字,則返回null。
- Annotation[] getAnnotations():返回該程序元素上存在的所有注解。
- boolean is AnnotationPresent(Class<?extends Annotation> annotationClass):判斷該程序元素上是否包含指定類型的注解作郭,存在則返回true陨囊,否則返回false.
- Annotation[] getDeclaredAnnotations():返回直接存在于此元素上的所有注釋。與此接口中的其他方法不同夹攒,該方法將忽略繼承的注釋蜘醋。(如果沒有注釋直接存在于此元素上,則返回長度為零的一個數組咏尝。)該方法的調用者可以隨意修改返回的數組压语;這不會對其他調用者返回的數組產生任何影響。
例子:
參考文章:
http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html
jdk1.8
spring-context-3.2.10