切换语言为:繁体

基于 Java 谈谈「注解」

  • 爱糖宝
  • 2024-05-15
  • 2093
  • 0
  • 0

一、简介

【概述】

不是程序本身,不能改变程序的运行结果,也不会影响程序运行的性能。可以对程序作出解释,但是区别于注释,注解可以写入参数,通过反射机制来获取所注解信息的访问。

【分类】

根据注解是否包含成员变量,可以分为如下两类。

分类

说明

标记注解

没有定义成员变量,这种注解仅利用自身的存在与否来提供信息

元数据注解

包含成员变量,因为可以接受更多的元数据,所以也被称为元数据注解。

【常见注解】

注解

作用域

说明

@Override

方法

指定方法重写,只能修饰方法。

@Deprecated

类、接口、成员方法和成员变量

表示某个元素(类、方法等)已过时

@SuppressWarnings

类、接口、成员方法

取消显示指定的编译器警告

@SafeVarargs

可变参数方法

抑制编译器警告

@FunctionalInterface

接口

指定某个接口必须是函数式接口

二、元注解

用于解释其他注解,自定义注解时可使用元注解。

1、@Documented

【概述】

标记注解,该注解修饰的注解类会被JavaDoc工具提取成文档。

【示例】

  1. 编写注解和测试类

@Documented
@Target({ ElementType.TYPE, ElementType.METHOD })
public @interface FxDocumented {
    String name() default "这是@Documented注解";
}

@FxDocumented(name = "fuxing")
public class FuXing {
    /**
     * 测试document
     */
    @FxDocumented(name = "fuxing")
    public String Test() {
        return "CodeUpHub测试@Documented";
    }
}

  1. 打开Java文件所在的目录,分别输入如下两条命令行:

javac FuXing.java FxDocumented.java
javadoc -d doc FuXing.java FxDocumented.java
  1. 运行成功后,打开生成的帮助文档,如下图

基于 Java 谈谈「注解」

2、@Target

【概述】

用来指定一个注解的使用范围,即被@Target修饰的注解可以用在什么地方。该注解有一个成员变量(value)用来设置适用目标。

【作用域常量】

枚举

说明

CONSTRUCTOR

用于构造方法

FIELD

用于成员变量(包括枚举常量)

LOCAL_VARIABLE

用于局部变量

METHOD

用于方法

PACKAGE

用于包

PARAMETER

用于类型参数(JDK 1.8新增)

TYPE

用于类、接口(包括注解类型)或enum声明

【示例】

@Documented
@Target({ ElementType.TYPE, ElementType.METHOD })	//表明该注解作用于类和方法
public @interface FxDocumented {
    String name() default "这是@Documented注解";
}

3、@Retention

【概述】

用于描述注解的生命周期,也就是该注解被保留的时间长短。该注解中的成员变量(value)用来设置作用在哪个时期。

【作用域常量】

生命周期大小排序为 SOURCE < CLASS < RUNTIME

枚举

说明

SOURCE

源码有效

CLASS

CLASS类有效

RUNTIME

运行时有效

4、@Inherited

【概述】

标记注解,用来指定该注解可以被继承。使用该注解的Class类,表示这个注解可以被用于该Class类的子类。就是说如果某个类使用了被@Inherited修饰的注解,则其子类将自动具有该注解。

三、自定义注解

【流程】

  1. 创建注解类Annotation;

  2. 定义成员变量(以方法的形式来定义);

  3. 可以使用default为成员变量指定初始值;

【示例】

@Target({METHOD})
@Inherited
@Retention(RUNTIME)	
public @interface FuXing {
    String name() default "FuXing";
}

0条评论

您的电子邮件等信息不会被公开,以下所有项均必填

OK! You can skip this field.