注解

作者: 写代码的海怪 | 来源:发表于2020-07-01 12:42 被阅读0次

在写 Java 的时候,一看到注解就另我很兴奋,因为这代表可以让我少写很多代码,如 @Select(),那就不用在 Mapper.xml 去配 MyBatis 了。但是这些注解背后到底做了什么,我是不知道的。因此这篇文章就深入了解一下注解。

先放个结论:注解只是个标注/标签,啥也不做。我们所看到的“行为”其实都有人去识别这个注解然后做的。

注解是什么

想想我们在读文言文的时候,我们基本是通过注解去了解意思的。比如看到

上面的 (2), (3), (4) 就是注解,看到后我们就去课文背后去看是啥意思:

OK,现在我们懂了“先生不知何许人也,......”的意思了。

Java 注解

和上面同理呀,JVM 看到注解 @Autowired,@Override 等,就去看这些玩意是啥意思呗,看懂了再去执行某些操作喽。

Java 注解的背后

这个时候你可能会想:JVM 去拿着注解去查背后的意义应该是 JVM 的事,我们的职责应该是去定义注解的意义,那又是如何定义的呢?

非常简单的一个思路:扫一次 Java 文件,把标了注解的东西(变量、方法、类.....)都拿出来,放到一个可能类似于 HashMap 的地方,比如:

@Shadiao
public void you;
@Shuaige
public void me;

存成

{
  'Shadiao': 说XXX是沙雕,
  'Shuaige': 说YYY是帅哥
}

存好后,就类似于我们所看到课文后面的注解表了。每次执行的时候,Java 就会跟所这个表去做相关的事。

ByteBuddy

为了完成上面的任务,有一个库 ByteBuddy 专门是用来检测注解,然后给他们附上操作的,是一种字节码增强技术。

一般先新建注解

public @interface XXX {}

然后检测这个注解

ByteBuddy()
.subclass(xxx)
.method(ElementMatchers.isAnnotatedWith(XXX.class))
.intercept(MethodDelegation.to(XXX.class)
.make()
.load()
.getLoaded()

注意要用 @Retention(RetentionPolicy.RUNTIME)

最后

看这上面这一串代码是不是头疼?其实Java本身已经提供了很多内置的注解了,如我们最熟悉的 @Override,当用别人的库的时候,一般别人也会提供很多注解,如 @Autowired@Select 等。一般来说并不需要我们自己去发明注解。

看完这篇文章,你只需要知道注解只是标签,使用 ByteBuddy 可以检测这些注解并附上自己想要的操作,当 Java 执行时看到注解后,会自动执行你之前附上的操作。最重要要记住的是,你可以忘掉怎么使用 ByteBuddy,因为大部分时候都有人给你写好了,直接用注解即可。

相关文章

  • 注解学习笔记

    什么是注解注解分类注解作用分类 元注解 Java内置注解 自定义注解自定义注解实现及使用编译时注解注解处理器注解处...

  • 注解与反射

    注解 声明一个注解类型 元注解 在定义注解时,注解类也能够使用其他的注解声明。对注解类型进行注解的注解类,我们称之...

  • 1.8 Java 注解annotation

    1.1 注解声明 Java注解Annotation,有声明注解和元注解 元注解:Java提供的元注解,所谓元注解就...

  • 注解的使用

    元注解 注解 注解本质就是接口: 元注解:修饰注解的注解 自定义注解 Text.java FruitName.ja...

  • 注解

    Java注解 注解 元注解 自定义注解 元注解:负责注解其他注解 共有4个标准的meta-annotation类型...

  • Spring高级应用之组合注解和元注解

    1.核心概念: 元注解:可以注解在其他注解上的注解;被注解的注解成为组合注解; 2.组合注解的定义步骤 定义组合注...

  • 2016.10.13-关于注解的自定义和注解的解析

    注解可以分为:1、标识性注解(没有成员变量) 2、注解 3、元注解(注解的注解) 1、注解的自定义 自定义注解的格...

  • 自定义注解

    注解分类 1、代码注解2、编译时注解3、运行时注解 注解范例 使用注解的类 注解解析类 注解实战 需求1、有一张用...

  • 【JAVA】注解

    元注解 用来定义、声明注解的注解。 @Inherited注解 使用此注解声明出来的自定义注解,在使用此自定义注解时...

  • Spring Boot常用注解

    注解速览 配置加载相关 Bean 声明注解 Bean 注入注解 SpringMVC 注解 MyBatis 注解 配...

网友评论

    本文标题:注解

    本文链接:https://www.haomeiwen.com/subject/ewycqktx.html