Java註解之 @Target、@Retention、@Documented簡介
Java註解之 @Target、@Retention、@Documented簡介
=========================
[email protected]可以實現三種功能:
(1)宣告類:Class
(2)宣告類別:Category
(3)宣告擴充套件:Extension
2.宣告類:這個就比較常用了,在這裡不多說。程式碼:
@interface SomeClass : NSObject <SomeDelegate>{
}
@end
3.宣告類別:
(1)類別能在不更改原來的類程式碼的情況下,為類增加方法或者重寫類的方法。
(2)類別只能新增或者重寫方法,但是不能新增變數。
(3)有網友說將類別名設定為“Private”,就能使類別中增加的方法成為私有方法,這個是不成立的(經過實際程式碼驗證)。
(4)如果是重寫類的已經存在的方法,則此重寫的方法會在整個執行環境中生效,而且不需要在用到的地方匯入實現類;
如果是為類增加新的方法,則需要在用的地方匯入。
(5)程式碼:
@interface ClassName(類別名){
}
@end
4.宣告擴充套件:
(1)擴充套件和類別語法上的的區別很簡單,就是類別名省略,只保留括號。
(2)擴充套件只是增加原來類的方法和變數的宣告,而不包含實現,所以,擴充套件沒有獨立的實現(@implementation),而是和原來的類共享一個實現。
(3)擴充套件不僅能在原來類的基礎上增加方法,也能增加變數。
(4)如果將擴充套件寫到實現檔案中,則增加的變數和方法就是私有變數和私有方法。
(5)程式碼:
@interface ClassName(){
}
@end
============================
先來看一個Spring中的一個常用註解
-
package org.springframework.stereotype;
-
import java.lang.annotation.Documented;
-
import java.lang.annotation.ElementType;
-
import java.lang.annotation.Retention;
-
import java.lang.annotation.RetentionPolicy;
-
import java.lang.annotation.Target;
-
@Target({ElementType.TYPE})
-
@Retention(RetentionPolicy.RUNTIME)
-
@Documented
-
@Component
-
public @interface Controller {
-
/**
-
* The value may indicate a suggestion for a logical component name,
-
* to be turned into a Spring bean in case of an autodetected component.
-
* @return the suggested component name, if any
-
*/
-
String value() default "";
-
}
@Target({ElementType.TYPE}) 註解
ElementType 這個列舉型別的常量提供了一個簡單的分類:註釋可能出現在Java程式中的語法位置(這些常量與元註釋型別(@Target)一起指定在何處寫入註釋的合法位置)
-
package java.lang.annotation;
-
/**
-
* The constants of this enumerated type provide a simple classification of the
-
* syntactic locations where annotations may appear in a Java program. These
-
* constants are used in {@link Target java.lang.annotation.Target}
-
* meta-annotations to specify where it is legal to write annotations of a
-
* given type.
-
* @author Joshua Bloch
-
* @since 1.5
-
* @jls 9.6.4.1 @Target
-
* @jls 4.1 The Kinds of Types and Values
-
*/
-
public enum ElementType {
-
/** 類, 介面 (包括註釋型別), 或 列舉 宣告 */
-
TYPE,
-
/** 欄位宣告(包括列舉常量) */
-
FIELD,
-
/** 方法宣告(Method declaration) */
-
METHOD,
-
/** 正式的引數宣告 */
-
PARAMETER,
-
/** 建構函式宣告 */
-
CONSTRUCTOR,
-
/** 區域性變數宣告 */
-
LOCAL_VARIABLE,
-
/** 註釋型別宣告 */
-
ANNOTATION_TYPE,
-
/** 包宣告 */
-
PACKAGE,
-
/**
-
* 型別引數宣告
-
*
-
* @since 1.8
-
*/
-
TYPE_PARAMETER,
-
/**
-
* 使用的型別
-
*
-
* @since 1.8
-
*/
-
TYPE_USE
-
}
@Retention({RetentionPolicy.Runtime}) 註解
RetentionPolicy這個列舉型別的常量描述保留註釋的各種策略,它們與元註釋(@Retention)一起指定註釋要保留多長時間
-
package java.lang.annotation;
-
/**
-
* Annotation retention policy. The constants of this enumerated type
-
* describe the various policies for retaining annotations. They are used
-
* in conjunction with the {@link Retention} meta-annotation type to specify
-
* how long annotations are to be retained.
-
*
-
* @author Joshua Bloch
-
* @since 1.5
-
*/
-
public enum RetentionPolicy {
-
/**
-
* 註釋只在原始碼級別保留,編譯時被忽略
-
*/
-
SOURCE,
-
/**
-
* 註釋將被編譯器在類檔案中記錄
-
* 但在執行時不需要JVM保留。這是預設的
-
* 行為.
-
*/
-
CLASS,
-
/**
-
*註釋將被編譯器記錄在類檔案中
-
*在執行時保留VM,因此可以反讀。
-
* @see java.lang.reflect.AnnotatedElement
-
*/
-
RUNTIME
-
}
@Documented註解
Documented註解表明這個註釋是由 javadoc記錄的,在預設情況下也有類似的記錄工具。 如果一個型別宣告被註釋了文件化,它的註釋成為公共API的一部分。