Java注解之 @Target、@Retention、@Documented简介

Java注解之 @Target、@Retention、@Documented简介

=========================

1.@interface可以实现三种功能:

(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的一部分。

猜你喜欢

转载自blog.csdn.net/qq_32444825/article/details/81538762