Java注解

156 阅读2分钟

Java注解

在Spring boot以及Spring Cloud的开发中用到了大量的注解,但是一直对注解的使用和基本工作原理不太了解。因此专门花点时间学习和整理Java注解的相关知识。主要涉及注解是什么,使用注解的好处,Java中如何使用注解以及注解的基本原理。其中重点是使用和基本原理。

注解是什么

JDK1.5开始提供注解。java.lang.annotation.Annotation接口中有这么一句话,用来描述注解。注解的本质就是一个继承了Annotation接口的接口。比如:@Overrided等价于

public interface Override extends Annotation{}

注解本质意义上拉说只是一种特殊的注释,需要有解析他的代码才能实现一些特殊的功能。

为什么要使用注解

最重要一点提升开发效率。注解都在class文件中,方便于源代码一起维护,并且在编译期就能验证正确性,方便排错。

如何使用注解

  1. Java内置的注解(元注解):

@Target:注解的作用目标

@Retention:注解生命周期

@Documented: 注解是否应该包含在JavaDoc中。

@Inherited: 注解是否允许子类继承。

  1. 自定义注解:自定义注解的使用非常简单:

    1. 定义注解:

      @Target(value = {ElementType.METHOD})
      @Retention(RetentionPolicy.RUNTIME)
      @Documented
      public @interface MessageUtil {
          String message() default "hello";
      }
      
    2. 定义注解处理器

      public class MessageUtilHandler {
          public void parse(Class<?> clazz) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
              //通过反射获取类
              final Object object = clazz.getConstructor(new Class[]{}).newInstance(new Object[]{});
              final Method[] methods = clazz.getDeclaredMethods();
              for(final Method method:methods){
                  MessageUtil messageUtil = method.getAnnotation(MessageUtil.class);
                  if(null!=messageUtil){
                      //方法调用
                      method.invoke(object,messageUtil.message());
                  }
              }
          }
      

扫描方法上的注解,然后调用注解修饰的方法,这里最重要的是注解处理器。注解处理器决定了注解的行为。

详细代码上传到github中。参见:

注解的基本原理

注解的本质是继承了Annotation接口的接口。当我们通过getAnnotation方法获取注解。其本质是通过动态代理机制生成一个实现注解接口的代理类。这个有时间在找机会单独写一篇文章。