Java Tutorials-10-注解

使用注解

// Class annotation
@Controller("topicControllerV2")
public class TopicController {

// Medhod annotation:
@RequestMapping(value = "/load", method = RequestMethod.GET)
public TopicLoadResponse topicLoad(@RequestParam(value = "client_id") String appId,
@RequestParam(value = "topic_url") String topicUrl,
@RequestParam(value = "topic_source_id", required = false) String topicSourceId) {
// ...method
}
}

定义一个注解

所有注解都隐式的继承自java.lang.annotation.Annotation

// Controller:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME) // 使用元注解
public @interface Controller { // 注解的定义: modifier @interface Annotation
String value() default ""; // 注解的方法都是这种格式: Type elementName() default defaultVal;
}

// RequestMapping
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Mapping
public @interface RequestMapping {
String name() default ""; //
String[] value() default {};
RequestMethod[] method() default {}; // RequestMethod是枚举类型GET/POST..
String[] headers() default {};
}

如何获取带有特定注解(这里用@YourAnnotation注解为例)的类, 使用了org.reflections.Reflections工具类:

Reflections reflections = new Reflections("org.test");
Set<Class<?>> classes = reflections.getTypesAnnotatedWith(YourAnnotation.class);

标准注解

JavaSE在java.lang.annotation和javax.annotation包定义了大量注解, 其中4个是元注解, 用于定义一般注解 &描述注解的行为属性.

  • @Deprecated: 所有场合,包 & 类 & 方法 & 属性
  • @SuppressWarnings: 类 & 方法 & 属性, 阻止某种警告信息, @SuppressWarnings(value={"unchecked","deprecation"})
  • @Override: 只有方法
  • @Resources: ?
  • @Resource: 可以写在属性上, 和setter方法上, 默认按照名称进行装配
  • @PostConstruct 方法, 指明该方法在构造器之后立刻被调用
  • @PreDestory 方法, 指明该方法在类被销毁前调用

元注解

  1. @Target:
    • @Target(ElementType.TYPE) // 类, 接口, 枚举, 注解
    • @Target(ElementType.METHOD) //方法
    • @Target(ElementType.PARAMETER) //方法参数
    • @Target(ElementType.FIELD) //字段
  2. @Retention:
    • @Retention(RetentionPolicy.SOURCE) //注解仅存在于源码中, 在class字节码文件中不包含
    • @Retention(RetentionPolicy.CLASS) // 默认的保留策略, 注解会在class字节码文件中存在, 但运行时无法获得,
    • @Retention(RetentionPolicy.RUNTIME) // 注解会在class字节码文件中存在, 在运行时可以通过反射获取到
  3. @Document: 说明该注解将被包含在javadoc中
  4. @Inherited: 一般在定义注解时使用, 说明这个子类可以继承父类中的这个注解