Java 注解与注解处理器

Java 注解与注解处理器

注解用处

注解( 也被成为元数据 ) 为我们在代码中添加信息提供了一种形式化的方法, 使我们在稍后的某个时刻非常方便的使用这些数据, 注解有下面这些特性:

  1. 注解的语法比较简单, 除了 @ 符号外, 基本与 java 固有语法一致
  2. 注解的快捷方式: 注解中有名字为 value 的元素, 在使用的时候, 如果该元素是唯一需要赋值的, 只需要在括号内给出该元素的值即可, 无需使用键值对的方式赋值
  3. java 只内置了三种标准注解及四种元注解
    • 标准注解: @Override, @Deprecated, @SuppressWarings
    • 元注解(专门负责新注解的创建)
      1. @Target: 表明注解可以使用在哪些地方
      2. @Retention: 定义注解可以在那一级别使用
      3. @Documented: 将此注解包含在 Javadoc 中
      4. @Inherited: 允许子类继承父类中的注解

什么时候使用注解呢? 注解在一定程度上把元数据和源代码结合在一起, 而不是把数据保存在外部配置文件中. 所以当创建描述符性质的类或者接口时, 一旦其中包含了重复性的工作, 可以考虑使用注解来简化和自动化该过程.

如何定义一个注解

注解的定义很像 Java 接口的定义, 实际上, 注解也将被编译成 Class 文件

import java.lang.annotation.*;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Test{
    
    }

除了 @ 符号外, @Test 很像一个空的接口. 这个注解方法体内没有任何元素, 称为标记注解. 并且注解可以嵌套一个注解

// 注解的使用
public class Testable {
    
    
    @Test void testExecute() {
    
    
        System.out.pritln("Executing..");
    }
}

注解的使用方法和修饰符的使用一模一样, 例如: pulblic、void、static 等,

了解注解是如何定义后, 聪明的读者可能会问了, 注解是如何如何起作用的呢? 是如何按照我们的想要的功能区实现相应的目的呢?这个问题交给注解处理器来时回答吧

注解处理器

如果没有用来读取注解的工具, 那注解也不会比注释更有用. 举一个不是很恰当的例子, 我们的目的是做一个汉堡, 注解的作用准备汉堡的一系列原材料, 注解处理器就类似于烹饪的过程. 只有注解的话, 不会比一个烧火棍更有用

注解处理器是通过反射机制实现的.

一般来说, 注解都会包含一些元素来表示某些值. 并且这些元素不能有不确定的值, 要么是默认值, 要么是在使用的时候提供值. 当注解处理器处理注解时, 可以使用这些值.

运行时注解处理器

  • 定义一个注解

    // 作用于方法上, 给当前被注解的方法返回输入的值
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)
    @Documented
    public @interface Get {
          
          
        String value() default "";
    }
    
  • 使用 @Get 注解

    public class AnnotationTest {
          
          
        @Get(value = "http://ip.taobao.com")
        public String getIpMsg() {
          
          
            return "";
        }
        @Get(value = "192.168.9.23")
        public String getIp() {
          
          
            return "";
        }
    }
    
  • 编写代码处理器, 获取 Get 的值

    public class AnnotationProcessor {
          
          
        public static void main(String[] args) {
          
          
            Method[] methods = AnnotationTest.class.getDeclaredMethods();
            for (Method m : methods) {
          
          
                Get get = m.getAnnotation(Get.class);
                System.out.println(get.value());
            }
        }
    }
    
  • 输出

    http://ip.taobao.com/59.108.54.37
    http://ip.taobao.com/
    

猜你喜欢

转载自blog.csdn.net/zjhcxdj/article/details/105785471
今日推荐