Java注解

什么是注解???

       当我们开发SpringBoot项目,我们只需对启动类加上@SpringBootApplication,就能自动装配,不需要编写冗余的xml配置。

如:当我们为项目添加lombok依赖,使用@Data来修饰实体类,我们就不需要编写getter和setter方法,构造函数等等。

@SpringBootApplication,@Data等像这种以@开头的代码 就是注解,只需简简单单几个注解,就能帮助我们省略大量冗余的代码,这是一个非常不可思议的事情!
但我们往往知道在哪些地方加上合适的注解,不然IDE会报错,却不知道其中的原理,那究竟什么是注解呢?

注解(Annotation ), 是 Java5 开始引入的新特性,是放在Java源码的类、方法、字段、参数前的一种特殊“注释”,是一种标记、标签。

注释往往会被编译器直接忽略,能够被编译器打包进入class文件,并执行相应的处理。

注解本质是一个继承了Annotation 的特殊接口,所以注解也叫声明式接口。

注解一般用于

  • 编译器可以利用注解来探测错误和检查信息,像@override检查是否重写
  • 适合工具类型的软件用的,避免繁琐的代码,生成代码配置,比如jpa自动生成sql,日志注解,权限控制
  • 程序运行时的处理: 某些注解可以在程序运行的时候接受代码的读取,比如我们可以自定义注解

注解的分类:

1.Java自带的标准注解

@Override:让编译器检查该方法是否正确地实现了覆写;
@SuppressWarnings:告诉编译器忽略此处代码产生的警告。
@Deprecated:标记过时的元素,这个我们经常在日常开发中经常碰到。
@FunctionalInterface:表明函数式接口注解

元注解

元注解是能够用于定义注解的注解,或者说元注解是一种基本注解,包括@Retention、@Target、@Inherited、@Documented、@Repeatable 等。
元注解也是Java自带的标准注解,只不过用于修饰注解,比较特殊。

@Retention

注解的保留策略, @Retention 定义了Annotation的生命周期。当 @Retention 应用到一个注解上的时候,它解释说明了这个注解的的存活时间。
它的参数:

RetentionPolicy.SOURCE注解只在源码阶段保留,在编译器进行编译时它将被丢掉
RetentionPolicy.CLASS注解只被保留到编译进行的时候,它并不会被加载到 JVM 中
RetentionPolicy.RUNTIME

注解可以保留到程序运行中的时候,它会被加载进 JVM 中,在程序运行中也可以获取到它们

如果@Retention不存在,则该Annotation默认为RetentionPolicy.CLASS

@Documented

它的作用是 用于制作文档,将注解中的元素包含到 doc 中

@Target 

指定了注解可以修饰哪些地方, 比如方法、成员变量、还是包等等
当一个注解被 @Target 注解时,这个注解就被限定了运用的场景。
常用的参数如下:

ElementType.ANNOTATION_TYPE给一个注解进行注解
ElementType.CONSTRUCTOR给构造方法进行注解
ElementType.FIELD给属性进行注解
ElementType.LOCAL_VARIABLE给局部变量进行注解
ElementType.METHOD给方法进行注解
ElementType.PACKAGE给包进行注解
ElementType.PARAMETER给一个方法内的参数进行注解
ElementType.TYPE给一个类型进行注解,比如类、接口、枚举

@Inherited

@Inherited 修饰一个类时,表明它的注解可以被其子类继承,缺省情况默认是不继承的。
换句话说:如果一个子类想获取到父类上的注解信息,那么必须在父类上使用的注解上面 加上@Inherit关键字
注意:

  • @Inherited仅针对@Target(ElementType.TYPE)类型的annotation有效
  • @Inherited 不是表明 注解可以继承,而是子类可以继承父类的注解

@Repeatable

使用@Repeatable这个元注解来申明注解,表示这个声明的注解是可重复的
@Repeatable 是 Java 1.8 才加进来的,所以算是一个新的特性。

2.自定义注解

我们可以根据自己的需求定义注解,一般分为以下几步:

1.新建注解文件, @interface定义注解

public @interface MyReport { } 

2.添加参数、默认值

public @interface MyReport {
    String name() default "";
    int value() default 0;
}

3. 用元注解配置注解

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface MyReport {
    String name() default "";
    int value() default 0;
}

我们一般设置 @Target和@Retention就够了,其中@Retention一般设置为RUNTIME,因为我们自定义的注解通常需要在程序运行中读取。

       注解本身对代码逻辑没有任何影响,如何使用注解完全取决于我们开发者用Java反射来读取和使用。反射真的很强大,不仅可以读取类的属性、方法、构造器等信息,还可以读取类的注解相关信息,以后还会经常遇到它。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值