java中注解的原理解析

 更新时间:2023年10月02日 09:31:14   作者:andone1024  
这篇文章主要介绍了java中注解的原理解析,java 注解又称 Java 标注,是 JDK5.0 引入的一种注释机制,可以理解为为某个东西,打个标记的记号,等要使用这个注解时,可以通过反射获取标注里面的内容,需要的朋友可以参考下

1.什么是java注解

java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制,可以理解为为某个东西(类,方法,字段。)

打个标记的记号,等要使用这个注解时,可以通过反射获取标注里面的内容。

2.注解原理

在编译器生成类文件时,标注可以被嵌入到字节码中。Java 虚拟机可以保留标注内容,在运行时可以获取到标注内容。

3.java内置注解

1.@Override 重写

2.@Deprecated 过期警告

3.@SuppressWarnings 忽略警告

等等

4.元注解和自定义注解

像程序员如何使用注解呢,肯定是自定义一个注解,那这个自定义注解编译器怎么认识呢,所以java提供一些元注解来解释下自定义注解是什么。

举个例子

自定义一个JobInfo注解

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Inherited 
public @interface JobInfo {
    String jobName() default "";
}

元注解: @Retention 表示这个注解的作用域 ,告知编译器这个JobInfo注解,在代码什么级别保存该注解信息。

在实际开发中,我们一般都写RUNTIME,当然根据自己需求而定;

枚举有

1.SOURCE:源代码时保留

2.CLASS:class文件中保留

3.RUNTIME:运行时保留

作用范围—》 RUNTIME>CLASS>SOURCE

public enum RetentionPolicy {
    /**
     * Annotations are to be discarded by the compiler.
     */
    SOURCE,
    /**
     * Annotations are to be recorded in the class file by the compiler
     * but need not be retained by the VM at run time.  This is the default
     * behavior.
     */
    CLASS,
    /**
     * Annotations are to be recorded in the class file by the compiler and
     * retained by the VM at run time, so they may be read reflectively.
     *
     * @see java.lang.reflect.AnnotatedElement
     */
    RUNTIME
}

元注解:@Documented 作用文档 将此注解包含在 javadoc 中 ,它代表着此注解会被javadoc工具提取成文档

元注解:@Target 标记这个注解应该是使用在哪种 Java 成员上面

public enum ElementType {
    /** Class, interface (including annotation type), or enum declaration */
    TYPE,
    /** Field declaration (includes enum constants) */
    FIELD,
    /** Method declaration */
    METHOD,
    /** Formal parameter declaration */
    PARAMETER,
    /** Constructor declaration */
    CONSTRUCTOR,
    /** Local variable declaration */
    LOCAL_VARIABLE,
    /** Annotation type declaration */
    ANNOTATION_TYPE,
    /** Package declaration */
    PACKAGE,
    /**
     * Type parameter declaration
     *
     * @since 1.8
     */
    TYPE_PARAMETER,
    /**
     * Use of a type
     *
     * @since 1.8
     */
    TYPE_USE
}
  • @Target(ElementType.TYPE)——接口、类、枚举、注解
  • @Target(ElementType.FIELD)——字段、枚举的常量
  • @Target(ElementType.METHOD)——方法
  • @Target(ElementType.PARAMETER)——方法参数
  • @Target(ElementType.CONSTRUCTOR) ——构造函数
  • @Target(ElementType.LOCAL_VARIABLE)——局部变量
  • @Target(ElementType.ANNOTATION_TYPE)——注解
  • @Target(ElementType.PACKAGE)——包

元注解@Inherited 表示继承,比如类A上打了@JobInfo注解,那么类B继承了类A,那么类B也可以拿到类A上的@JobInfo注解信息

其他元注解

  • @SafeVarargs - Java 7 开始支持,忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告。
  • @FunctionalInterface - Java 8 开始支持,标识一个匿名函数或函数式接口。
  • @Repeatable - Java 8 开始支持,标识某注解可以在同一个声明上使用多次。

5.总结

程序员要使用自定义注解,必须使用元注解标识一些信息,告知编译器这个自定义注解的一些信息,这样编译器才知道怎么去校验和保留该自定义注解信息到字节码中

6.TODO

1.注解的使用(打标记)

2.注解的获取(获取注解标记的信息,拿到这些信息做其他事情。)通常我们说一个注解的作用时,说的是获取这个注解打标记的内容然后干了什么事情,这个作用。

到此这篇关于java中注解的原理解析的文章就介绍到这了,更多相关java注解原理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • javaweb判断当前请求是否为移动设备访问的方法

    javaweb判断当前请求是否为移动设备访问的方法

    这篇文章主要为大家详细介绍了javaweb判断当前请求是否为移动设备访问的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • Java使用跳转结构实现队列和栈流程详解

    Java使用跳转结构实现队列和栈流程详解

    这篇文章主要介绍了Java使用跳转结构实现队列和栈流程,连续结构和跳转结构是数据结构中常见的两种基本数据结构,而我们本次的主角栈和队列都 既可以使用使用跳转结构实现也可以使用连续结构实现
    2023-04-04
  • 关于HashMap 并发时会引起死循环的问题解析

    关于HashMap 并发时会引起死循环的问题解析

    JDK1.8之前采用头插,即在链表结构上每次都把数据放在链表头部。JDK1.8采用尾插方法,很多朋友在学习Java并发容器和框架时,看到为什么要使用ConcurrentHashMap时不知道究其原因,今天小编通过本文给大家介绍下HashMap 并发死循环问题,一起看看吧
    2021-05-05
  • springboot整合Dubbo与Feign的实现 (无注册中心)

    springboot整合Dubbo与Feign的实现 (无注册中心)

    本文主要介绍了springboot整合Dubbo与Feign的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • 升级springboot中spring框架的版本的实现方法

    升级springboot中spring框架的版本的实现方法

    本文主要介绍了升级springboot中spring框架的版本的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-08-08
  • JPA CriteriaBuilder子查询方式

    JPA CriteriaBuilder子查询方式

    这篇文章主要介绍了JPA CriteriaBuilder子查询方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • 解决myBatis中openSession()自动提交的问题

    解决myBatis中openSession()自动提交的问题

    在学习MySQL过程中,发现插入操作自动提交,问题原因可能是myBatis中的openSession()方法设置了自动提交,或者是MySQL的默认引擎设置为不支持事务的MyISAM,解决办法包括更改myBatis的提交设置或将MySQL表的引擎改为InnoDB
    2024-09-09
  • Java数组实现动态初始化的实例详解

    Java数组实现动态初始化的实例详解

    在本篇文章里小编给大家整理的是一篇关于Java数组实现动态初始化的实例详解内容,有兴趣的朋友们可以学习下。
    2021-10-10
  • java利用Apache commons codec进行MD5加密,BASE64加密解密,执行系统命令

    java利用Apache commons codec进行MD5加密,BASE64加密解密,执行系统命令

    这篇文章主要介绍了java利用apache Commons包进行MD5加密,BASE64加密解密与执行系统命令希望对大家有用
    2017-12-12
  • 详解java中接口与抽象类的区别

    详解java中接口与抽象类的区别

    这篇文章主要介绍了详解java中接口与抽象类的区别的相关资料,希望通过本文能帮助到大家,让大家轻松理解掌握接口与抽象类的区别,需要的朋友可以参考下
    2017-10-10

最新评论