Java0基础入门到精通之关于 Java 注解(annotation)编程
小职 2021-03-08 来源 : 阅读 255 评论 0

摘要:本文主要介绍了Java0基础入门到精通之关于 Java 注解(annotation)编程,通过具体的内容向大家展现,希望对大家Java的学习有所帮助。

本文主要介绍了Java0基础入门到精通之关于 Java 注解(annotation)编程,通过具体的内容向大家展现,希望对大家Java的学习有所帮助。

Java0基础入门到精通之关于 Java 注解(annotation)编程

前言

 

今天在看以前写的代码,发现自己对注解的了解还不是非常透彻,经常选择性就忽视了对注解实现的探究,遂查询资料学习了一下。

 

注解是什么

 

实现格式

 

从代码来看我们知道注解的实现格式是:

 

public @interface MyAnnotation{

    属性列表;

}

所以我们有了第一直觉,注解可能是一个接口。通过查询资料得知(可以通过反编译软件),实际上 @interface 是自定义接口对 annotation 接口的继承,@interface 实际是一个语法糖。

 

import java.lang.annotation.Annotation;

public interface MyAnnotation extends Annotation{

    属性列表;

}

使用位置

 

类、方法、成员变量、形参位置。

 

分类

 

不同角度,我们对注解能有不同的分类,但知道了注解的实现原理后就会明白,实际上用法和实现方法都是一回事。

 

来源

 

1. JDK注解:一般都是在编译时起用作的注解,比如我们最为熟悉的 @Override。

 

2. 第三方框架注解

 

3. 自定义注解

 

运行机制(保留策略)

 

@Retention({保留策略})

    public @interface MyAnnotation{

        属性列表;

    }

1.源码(SOURCE)注解:注解只在源码中存在,编译成.class文件就不存在了,也就是说只能起到 “看” 的作用。

 

2.编译(CLASS)注解:注解在源码和.class文件中都存在(JDK自带注解都属于编译时注解),一般用来作语法校验。

 

3.运行(RUNTIME)注解:在运行阶段还起作用,甚至会影响运行逻辑的注解(@Autowired属于运行时注解),第三方框架和自定注解一般采用 runtime 的保留策略,能实现依赖注入、切面编程等功能。

 

元注解

 

实际在上面,我们已经看到一个元注解了(@Retention)。元注解就是加在注解上描述注解的注解。 一共有5个。

 

1. @Documented

 

在生成javadoc的时候就会把@Documented注解给显示出来。

 

2. @Target(关键)

 

限定作用位置,Method、Class等等。

 

9. @Inherited

 

被 @Inherited 注解的注解修饰了一个父类,如果他的子类没有被其他注解修饰,则它的子类也继承了父类的注解。

 

10. @Retention(关键)

 

上文的保留策略注解,影响注解作用。

 

6. @Repeatable (不重要)

 

@Repeatable 注解是用于声明其它类型注解的元注解,来表示这个声明的注解是可重复的。@Repeatable的值是另一个注解,其可以通过这个另一个注解的值来包含这个可重复的注解。

 

如何使用

 

我们先来了解一下注解粗浅的使用。最简单的,

 

使用自定义注解就是分为三步:定义注解、使用注解、读取注解。

 Java0基础入门到精通之关于 Java 注解(annotation)编程

 

 

我们只要牢牢地把握住这三步,就能掌握注解的使用。

 

定义注解

 

因为,注解的基本作用是根据注解中的值,判断该如何执行被注解代码块。所以,在定义注解时,除了要根据功能加元注解外,还要根据业务意义,编写合适的方法名称。

 

比如,如果我们要编写一个锁注解:

 

@Documented

@Retention(RUNTIME)

@Target({TYPE, METHOD})

public @interface Lock {

    //输锁名称

    String lockName();

    //被锁值

    String key();

    //锁级别

    int level();

    //异常

    String exception() default "";

}

在一个注解中,能够返回的类型有:基本数据类型、String、enum、Class、其他注解以及前几者的一维数组。

 

注意: 如果没有 default,那么使用时就必须要入参。

 

使用注解

 

注解在该注解的地方,入参必入参的参数。

 

Tips:如果注解中只有一个函数,虽然使用时候不需要加函数名称就可以直接入参,但个人建议对于自定义注解,在入参时,还是将函数名称写全,增强代码可读性。

 

读取注解

 

我们先想一想,如果是我们自己实现一个注解读取的方法,我们该怎么来实现呢?

 

目前我想到的无非就是两个:

 

1. 在字符串或字节码文件中找注解:这个判断可不好写啊,而且复杂字符串处理不了。

 

2. 通过反射获得类、方法、成员变量上的注解。

 

明眼人就能看出来 2 比 1 靠谱多了,而且还容易实现。

 

最简单的一种读取方式:

 

public static void main(String[] args) throws NoSuchMethodException {

     Class<Module> modelClazz = Module.class;

     Method method = modelClazz.getMethod("lock", null);

     Lock annotationLock = method.getAnnotation(Lock.class);

     //获取注解在 lock 方法上的 value

     String lockName = annotationLock.lockName();

 }

这也是框架注解的基本实现原理,因为要获取注解的具体代码块,所以一般需要扫描包。

 

对于切面编程,引入依赖 aspectj 后,那我们就有了更简单的调用方法:

 

//切面代码节选

   public Object around(ProceedingJoinPoint pjp) throws Throwable {

       MethodSignature signature = (MethodSignature) pjp.getSignature();

       Lock lock = signature.getMethod().getAnnotation(Lock.class);

       lock.lockName();

   }

具体关于切面编程与 joinpoint 的知识,可以参考:

 

https://blog.csdn.net/qq_15037231/article/details/80624064

 

注解的作用

 

至此我们可以总结出注解的作用。

 

* 编程提示

 

保留策略为源码的注解,一般为提示性注解,比如 @deprecated。

 

* 用于切面,减少重复代码

 

保留策略为运行的注解,0入侵改变函数的运行效果,一般用于重复性功能,比如日志输出、数据格式校验等。

 

* 简化配置信息,项目结构

 

主要是对于 springboot 这个框架的作用。因为注解可以取值,所以在设置默认配置信息的同时,也支持输入配置信息。

 

* 格式校验

 

一般为代码的语法检验,存在与 jdk 的注解包中,比如 @Override。


我是小职,记得找我

✅ 解锁高薪工作

✅ 免费获取学习教程,开发工具,代码大全,参考书籍

Java0基础入门到精通之关于 Java 注解(annotation)编程

本文由 @小职 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程