Java高级技巧之注解(Annotation)

本文详细介绍了Java注解(Annotation)的概念,包括定义、元注解(@Retention、@Documented、@Target、@Inherited、@Repeatable)、注解元素的使用,以及预置的@Deprecated、@Override、@SuppressWarnings等注解。通过示例展示了注解如何与反射结合,以及注解在编译、运行时的作用。此外,文中还探讨了注解在简化事件监听等场景的应用,强调了注解在现代Java开发中的重要性。

我又更新了,今天总结一下java开发中一个比较常见的东西-----------注解(Annotation),看起来很高大上的样子。
在这里插入图片描述
说明:版本Java8(最新版本14),差的辈分有点多

关于注解,在日常开发中是很常见的,比如@Override,这是覆写某个方法;@Deprecated表面方法已经过时,不建议使用(Java8有好多方法都被标记为已过时);还有在看一些源码的时候,很多代码都有注解的存在,比如在这里插入图片描述
这个注解表明Runnable是函数式接口(接口只能存在一个抽象方法)。
下面进入正题!

一、什么是注解

注解(Annotation),也叫java标注,从本质上来说也是一种类型,是jdk1.5以后引入的。它可以用来标注类、方法、变量、包等,可以通过反射来获取它(getAnnotation)。为了方便理解,你可以把注解想象成标签,作用相似。

定义

注解的定义格式是这样的:

modifiers @interface AnnotationName {
   
   
	elementDeclaration1,
	elementDeclaration1,
	......
}

每个元素的声明形式:type elementName()
或者type elementName() default value;
那么定义一个注解很简单,像这样

public @interface AnnotationTest {
   
   
  	String name() default "";
}

有点像接口的定义

应用

像这样就可以简单的应用刚才定义的注解

@AnnotationTest
public class TestForAnnotation {
   
   

}

但是这是这样的话,这个注解是没法工作的,要想它能够正常工作,需要用到元注解。
在这里插入图片描述

二、元注解

元注解就是注解的注解,说起来有点绕。假如普通注解是一张标签,那么元注解就是给普通的注解(标签)进行解释说明的。
元注解有@Retention,@Documented、@Target、@Inherited、@Repeatable 5种。

@Retention

Retention意思是保留。它标注在注解上时,声明了这个注解的生命周期。源代码如下,

public @interface Retention {
   
   
    RetentionPolicy value();
}

它的取值是RetentionPolicy,这是一个枚举类,有以下三种取值:

  • RetentionPolicy.SOURCE 注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视。
  • RetentionPolicy.CLASS 注解只被保留到编译进行的时候,它并不会被加载到 JVM 中。
  • RetentionPolicy.RUNTIME 注解可以保留到程序运行的时候,它会被加载进入到 JVM 中,所以在程序运行时可以获取到它们。

我们可以对上面定义的那个注解进行标注:

@Retention(RetentionPolicy.RUNTIME)
@interface AnnotationTest {
   
   
}

这样注解AnnotationTest的生命周期就会持续到程序运行。

@Documented

类和方法的注解默认是不出现在javadoc种的,但是使用@Documented修饰的注解会被包含进javadoc种。

@Target

翻译过来就是目标,@Target标明了注解被应用到的地方。
本来注解可以被应用到任何地方,但是被@Target修饰的话,那这个注解就只能被应用的指定的地方。它的源码如下:

public @interface Target {
   
   
    ElementType[] value();
}

它的取值是ElementType,也是一个枚举类型,[]表面它可以取多个值。取值如下:

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

@Inherited

英文直译的话是遗传,那么放在java语言环境中就是继承。所以被@Inherited修饰的注解是可以被继承的。

@Inherited
@Retention(RetentionPolicy.RUNTIME)
@interface AnnotationTest {
   
   
}

@AnnotationTest
class Parent {
   
   
}

class Child extends Parent {
   
   
}

注解AnnotationTest 被@Inherited修饰,父类Parent被@AnnotationTest 修饰,子类Child继承父类,那么子类也会拥有这个注释。
可以这样理解:
老子非常有钱,所以人们给他贴了一个标签–土豪
那么当老子的儿子长大以后,人们也会给他贴同样的土豪标签,因为他继承了他爸的有钱嘛。

@Repeatable

java1.8添加了这个注解,意思就是说该注解是可以重复使用的。
当一个注解的值可以是不同的时候,使用@Repeatable
比如一个人他既是老师又是作家还是一个老板,那么就可以这样来定义和取值:

@interface Persons {
   
   
    Person[] value();
}

@Repeatable(Persons.class)
@interface Person {
   
   
    String role() default "";
}
@Person(role = "老师")
@Person(role = "作家")
@Person(role = "老板")
class SuperMan {
   
   

}

上面Person被@Repeatable注解修饰,@Repeatable括号里的类相当于一个容器,能够包含当前所修饰注解的一个容器。这个容器本身也是一个注解,如示例中的

@interface Persons {
   
   
    Person[] value();
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值