前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java 注解与注解处理器

Java 注解与注解处理器

作者头像
芥末鱿鱼
发布2022-05-05 14:52:54
1800
发布2022-05-05 14:52:54
举报
文章被收录于专栏:玩转 Spring Cloud玩转 Spring Cloud

Java 注解与注解处理器

文章目录

注解用处

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

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

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

如何定义一个注解

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

代码语言:javascript
复制
import java.lang.annotation.*;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Test{}

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

代码语言:javascript
复制
// 注解的使用
public class Testable {
    @Test void testExecute() {
        System.out.pritln("Executing..");
    }
}

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

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

注解处理器

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

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

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

运行时注解处理器

定义一个注解

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

使用 @Get 注解

代码语言:javascript
复制
public class AnnotationTest {
    @Get(value = "http://ip.taobao.com")
    public String getIpMsg() {
        return "";
    }
    @Get(value = "192.168.9.23")
    public String getIp() {
        return "";
    }
}

编写代码处理器, 获取 Get 的值

代码语言:javascript
复制
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());
        }
    }
}

输出

代码语言:javascript
复制
http://ip.taobao.com/59.108.54.37
http://ip.taobao.com/
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-04-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 注解用处
  • 如何定义一个注解
  • 注解处理器
    • 运行时注解处理器
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档