我又更新了,今天总结一下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();

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





