1. 程式人生 > >Java註解之 @Target、@Retention、@Documented簡介

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中的一個常用註解

 
  1. package org.springframework.stereotype;

  2.  
  3. import java.lang.annotation.Documented;

  4. import java.lang.annotation.ElementType;

  5. import java.lang.annotation.Retention;

  6. import java.lang.annotation.RetentionPolicy;

  7. import java.lang.annotation.Target;

  8.  
  9. @Target({ElementType.TYPE})

  10. @Retention(RetentionPolicy.RUNTIME)

  11. @Documented

  12. @Component

  13. public @interface Controller {

  14.  
  15. /**

  16. * The value may indicate a suggestion for a logical component name,

  17. * to be turned into a Spring bean in case of an autodetected component.

  18. * @return the suggested component name, if any

  19. */

  20. String value() default "";

  21.  
  22. }

@Target({ElementType.TYPE}) 註解

ElementType 這個列舉型別的常量提供了一個簡單的分類:註釋可能出現在Java程式中的語法位置(這些常量與元註釋型別(@Target)一起指定在何處寫入註釋的合法位置)

 
  1. package java.lang.annotation;

  2.  
  3. /**

  4. * The constants of this enumerated type provide a simple classification of the

  5. * syntactic locations where annotations may appear in a Java program. These

  6. * constants are used in {@link Target java.lang.annotation.Target}

  7. * meta-annotations to specify where it is legal to write annotations of a

  8. * given type.

  9.  
  10. * @author Joshua Bloch

  11. * @since 1.5

  12. * @jls 9.6.4.1 @Target

  13. * @jls 4.1 The Kinds of Types and Values

  14. */

  15. public enum ElementType {

  16. /** 類, 介面 (包括註釋型別), 或 列舉 宣告 */

  17. TYPE,

  18.  
  19. /** 欄位宣告(包括列舉常量) */

  20. FIELD,

  21.  
  22. /** 方法宣告(Method declaration) */

  23. METHOD,

  24.  
  25. /** 正式的引數宣告 */

  26. PARAMETER,

  27.  
  28. /** 建構函式宣告 */

  29. CONSTRUCTOR,

  30.  
  31. /** 區域性變數宣告 */

  32. LOCAL_VARIABLE,

  33.  
  34. /** 註釋型別宣告 */

  35. ANNOTATION_TYPE,

  36.  
  37. /** 包宣告 */

  38. PACKAGE,

  39.  
  40. /**

  41. * 型別引數宣告

  42. *

  43. * @since 1.8

  44. */

  45. TYPE_PARAMETER,

  46.  
  47. /**

  48. * 使用的型別

  49. *

  50. * @since 1.8

  51. */

  52. TYPE_USE

  53. }

@Retention({RetentionPolicy.Runtime}) 註解

RetentionPolicy這個列舉型別的常量描述保留註釋的各種策略,它們與元註釋(@Retention)一起指定註釋要保留多長時間

 
  1. package java.lang.annotation;

  2. /**

  3. * Annotation retention policy. The constants of this enumerated type

  4. * describe the various policies for retaining annotations. They are used

  5. * in conjunction with the {@link Retention} meta-annotation type to specify

  6. * how long annotations are to be retained.

  7. *

  8. * @author Joshua Bloch

  9. * @since 1.5

  10. */

  11. public enum RetentionPolicy {

  12. /**

  13. * 註釋只在原始碼級別保留,編譯時被忽略

  14. */

  15. SOURCE,

  16. /**

  17. * 註釋將被編譯器在類檔案中記錄

  18. * 但在執行時不需要JVM保留。這是預設的

  19. * 行為.

  20. */

  21. CLASS,

  22. /**

  23.      *註釋將被編譯器記錄在類檔案中

  24.      *在執行時保留VM,因此可以反讀。

  25. * @see java.lang.reflect.AnnotatedElement

  26. */

  27. RUNTIME

  28. }

@Documented註解

Documented註解表明這個註釋是由 javadoc記錄的,在預設情況下也有類似的記錄工具。 如果一個型別宣告被註釋了文件化,它的註釋成為公共API的一部分。