java 元数据 和 元注解

news2024/9/20 17:00:18
  • 基本介绍

  • 三种基本注解

  • @Override

  • @Deprecated

  • @SuppressWarnings

  • 四种元注解

  • @Retention

  • @Target

  • @Documented

  • @@Inherited


一、基本介绍

1.概述

java注解(Annotation)[ˌ ænəˈ teɪʃn],又称java标注,也被称为元数据(关于数据的数据,描述数据的数据)(Metadata)[ˈ metədeɪtə],可用于修饰或者解释包、类、方法、属性、构造器,局部变量等数据信息

java注解和注释一样,不会影响程序逻辑,但注解可以被编译或运行,相当于嵌入在代码中的补充信息。在javaSE中,注解的功能比较单一,例如标记过时的功能,忽略警告等等。但注解在javaEE中占据了更重要的角色,尤其是在使用框架时,例如用来配置应用程序的任何切面,代替javaEE旧版中所残留的冗余代码和XML配置等等。

2.使用

使用Annotation时,要在它前面增加“@”符号,并把该注解当作一个修饰符来使用。以修饰它支持的程序元素。


二、3种基本注解

0.总览 :

  • @Override - 检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。

  • @Deprecated - 标记某个程序元素(类或者方法等)已过时。如果使用该方法,会报编译警告。

  • @SuppressWarnings - 指示编译器去忽略注解中声明的警告。

1.“@Override”:

①含义

Override就是重写的意思,如下 :

②源码

@Override最大的价值在于它的判断功能。通过Ctrl + b/B 可以查看@Override源码,如下 :

/*
 * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 */

package java.lang;

import java.lang.annotation.*;

/**
 * Indicates that a method declaration is intended to override a
 * method declaration in a supertype. If a method is annotated with
 * this annotation type compilers are required to generate an error
 * message unless at least one of the following conditions hold:
 *
 * <ul><li>
 * The method does override or implement a method declared in a
 * supertype.
 * </li><li>
 * The method has a signature that is override-equivalent to that of
 * any public method declared in {@linkplain Object}.
 * </li></ul>
 *
 * @author  Peter von der Ah&eacute;
 * @author  Joshua Bloch
 * @jls 8.4.8 Inheritance, Overriding, and Hiding
 * @jls 9.4.1 Inheritance and Overriding
 * @jls 9.6.4.4 @Override
 * @since 1.5
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}

其实,@Override源码中,最重要的无非最后两行。“@interface”表示Override是一个注解类,而不是接口。

“@Override”只能修饰方法,不能修饰其他程序元素(比如类,包,属性等)。这一点,其实源码中也有体现——Override源码中的“@Target(ElementType.METHOD)”明确指出了修饰的元素类型是METHOD(方法)。

PS : “@Target”用于修饰注解的注解,我们称之为“元注解”。

2.“@Deprecated”:

①含义

Deprecated就是不赞成的意思,如下 :

②源码

“@Deprecated”可以标记过时的程序元素。仍然通过Ctrl + b/B 快捷键追溯一下Deprecated的源码,如下 : (这次仅截取关键部分)

package java.lang;

import java.lang.annotation.*;
import static java.lang.annotation.ElementType.*;

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, MODULE, PARAMETER, TYPE})
public @interface Deprecated {
    String since() default "";
    boolean forRemoval() default false;
}

同样,“@interface”表示Deprecated是一个注解类。而“@Target”元注解中,也标注出了@Deprecated可以修饰的数据元素,从左往右依次为 : {构造器,属性,局部变量,方法,包,模块,参数,类型(即类)}

③使用

“@Deprecated”修饰的程序元素并非无法使用,只是不建议使用。来举个栗子。

演示 :

package advanced.Annotation;

/**
 * @author : Cyan_RA9
 * @version : 5.0
 */
public class Deprecated_ {
    @Deprecated
    public void f() {
        System.out.println("这方法没啥屁用,不建议使用。你非要用当我没说。。。");
    }
}

class Test {
    public static void main(String[] args) {
        Deprecated_ deprecated_ = new Deprecated_();
        deprecated_.f();
    }
}

运行结果 :

其实,当你在调用@Deprecated注解修饰的方法时,IDEA就会给出提示,如下图所示 :

可以明显看到被“@Deprecated”注解修饰的f() 方法是被删除线“ ”标注的。

④补充

啥时候用“@Deprecated”比较多?

比如,当JDK进行版本更迭的时候,新版本的JDK对旧版本的某些类或者某些方法进行了更新,可能会定义新的类型,这时候就会在旧版本的对应类型或者对应方法前打上@Deprecated标注,提醒java人们这是旧的啦,建议你用新的捏。

3.“@SuppressWarnings” :

①含义

SuppressWarnings就是抑制警告,禁止警告的意思,如下 : (Warnings小学词汇)

②格式

“@SuppressWarnings”的使用与前面两个注解略有出入。使用格式如下 :

@SuppressWarnings("explanation1", "explanation2", "explanation3", ......)
//双引号中的说明信息不同,达到的抑制警告效果便不同。

③属性说明汇总

“@SuppressWarnings”中常见的属性说明有 :

"all"

抑制所有警告

"boxing"

抑制与“封装/拆装”相关的警告

"cast"

抑制与"强转类型"相关的警告

"dep-ann"

抑制与"淘汰注释"相关的警告

"deprecation"

抑制与"淘汰"相关的警告

"fallthrough"

抑制与"switch陈述式中遗漏break"相关的警告

"finally"

抑制与"未传回finally区块"相关的警告

"hiding"

抑制与"隐藏变数的区域变数"相关的警告

"incomplete-switch"

抑制与"switch陈述式(enum case)中遗漏项目"相关的警告

"javadoc"

抑制与"javadoc"相关的警告

"nls"

抑制与"非nls字串文字"相关的警告

"resource"

抑制与"使用Closeable类型的资源"相关的警告

"null"

抑制与"空值分析"相关的警告

"rawtypes"

抑制与"使用raw类型"相关的警告(泛型)

"restriction"

抑制与"使用不建议或禁止参照"相关的警告

"serial"

抑制与"可序列化的类别遗漏serialVersionUID栏位"相关的警告

"static-access"

抑制与"静态存取不正确"相关的警告

"static-method"

抑制与"可能宣告为static的方法"相关的警告

"super"

抑制与"置换方法相关但不含super呼叫"的警告

"synthetic-access"

抑制与"内部类别的存取未最佳化"相关的警告

"sync-override"

抑制"因置换同步方法而遗漏同步化"的警告

"unchecked"

抑制与"未检查的作业"相关的警告

"unqualified-field-access"

抑制与"栏位存取不合格"相关的警告

"unused"

抑制与"未用的程式码和停用的程式码"相关的警告(变量未使用)

部分属性演示 :

package advanced.Annotation;

import java.util.ArrayList;
import java.util.List;

/**
 * @author : Cyan_RA9
 * @version : 5.0
 */
    @SuppressWarnings({})
public class SuppressWarnings_ {
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add("");
        list.add(1);
        list.add(1);
        int i;
        System.out.println(list.get(2));
    }
}

警告信息如下图所示 :

这时候可以通过在注解“@SuppressWarnings”中分别添加"rawtypes", "unchecked", "unused"属性说明来去除警告信息。如下图所示 :

添加属性说明后,⚠全部消失了,如下图所示 :

⑤作用域

关于@SuppressWarnings注解的作用域 : 取决于该注解的定义位置

eg : 当它放在main方法前时,抑制警告的范围就是main函数;当它定义在类上,作用域就是整个类;当然,也可以在固定的警告语句上面使用@SuppressWarnings注解,通过传入指定的属性说明实现精准的消除警告。

⑥源码

通过Ctrl + b/B快捷键快速追溯到SuppressWarnings注解类的源码,源码如下 : (仅截取关键部分)

package java.lang;

import java.lang.annotation.*;
import static java.lang.annotation.ElementType.*;

@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE, MODULE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
    String[] value();
}

同样的。"@interface"元注解表明SuppressWarnings是一个注解类。而“@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE, MODULE})”表明了@SuppressWarnings注解的使用范围,从左往后依次是”{类型(类),属性,方法,参数,构造器,局部变量,模块}“

三、4种元注解

0.总览 :

在Java中,将“修饰注解的注解”称为元注解。元注解使用并不多,本身作用也没多大,了解即可。可以看懂源码就足够了。

  • @Retention - 标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可以通过反射访问(保存时间)。

  • @Documented - 标记这些注解是否包含在javadoc用户文档中。

  • @Target - 标记这个注解应该是哪种 Java 成员(可以作用于哪些程序元素)。

  • @Inherited - 标记这个注解是继承于哪个注解类(默认 注解并没有继承于任何子类)

1.“@Retention”:

①含义

Retention就是保持,保留的意思,如下图所示 :

②使用

“@Retention”只能用于修饰一个注解定义,用于指定该注解可以保留多长时间,@Retention元注解中包含一个RetentionPolicy类型的成员变量,使用@Retention元注解时,必须为该成员变量指定值。

RetentionPolicy成员变量三种值 :

RetentionPolicy.SOURCE

编译器使用后,直接丢弃这种策略的注解

RetentionPolicy.CLASS

编译器将把注解记录在class文件中,当运行程序时,jvm不会保留注解,这是成员变量的默认值

RetentionPolicy.RUNTIME

编译器将把注解记录在class文件中,当运行程序时,jvm会保留注解,程序可以通过反射获取该注解。

③示意图

三种成员变量值的效果如下 :

演示 :

以Override的源码为例,如下:(仅截取关键部分)

package java.lang;

import java.lang.annotation.*;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}

注意看,“@Retention(RetentionPolicy.SOURCE)”中,RetentionPolicy类枚举常量是SOURCE,这就表示“@Override”注解生效的范围仅仅在.java的源文件中,不会在.class文件中生效,也不会在程序运行时被jvm读取。

2."@Target" :

①含义

Target就是目标的意思,如下图所示 :

②使用

@Target元注解可以指明当前注解可以作用于哪些程序元素。之前的三大基本注解中,均演示过”@Target“元注解。如下 :

③源码

Target元注解源码如下:(仅截取了重要部分)

package java.lang.annotation;

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {

    ElementType[] value();
}

可以看到Target底层是一个ElementType类型的数组。而通过Ctrl + b/B追溯源码,我们可以看到ElementType本质上是一个枚举类。如下 :

package java.lang.annotation;

public enum ElementType {
    /** Class, interface (including annotation interface), enum, or record
     * declaration */
    TYPE,

    /** Field declaration (includes enum constants) */
    FIELD,

    /** Method declaration */
    METHOD,

    /** Formal parameter declaration */
    PARAMETER,

    /** Constructor declaration */
    CONSTRUCTOR,

    /** Local variable declaration */
    LOCAL_VARIABLE,

    /** Annotation interface declaration (Formerly known as an annotation type.) */
    ANNOTATION_TYPE,

    /** Package declaration */
    PACKAGE,

    /**
     * Type parameter declaration
     *
     * @since 1.8
     */
    TYPE_PARAMETER,

    /**
     * Use of a type
     *
     * @since 1.8
     */
    TYPE_USE,

    /**
     * Module declaration.
     *
     * @since 9
     */
    MODULE,

    /**
     * Record component
     *
     * @jls 8.10.3 Record Members
     * @jls 9.7.4 Where Annotations May Appear
     *
     * @since 16
     */
    RECORD_COMPONENT;
}

ElementType枚举类中的这些枚举常量,其实就是我们说的”程序元素“。即注解可作用于的程序成分。

3.”@Documented“ :

①含义

Documented就是登记在案,文件化的意思,如下图所示 :

②使用

“@Documented”元注解修饰的注解类,会在javadoc文件中显式地呈现

演示 :

先定义一个注解类Demo,并在该注解类中使用@Documented元注解修饰。如下 :

package advanced.Annotation;

import java.lang.annotation.*;

/**
 * @author : Cyan_RA9
 * @version : 2.0
 */
@Documented
@Retention(RetentionPolicy.SOURCE)
@Target(ElementType.METHOD)
public @interface Demo {
    //自定义一个注解类。
}

然后在定义一个测试类Test_EX,并在测试类中定义两个方法,用自定义的注解”@Demo“去修饰方法。如下 :

package advanced.Annotation.test;

import advanced.Annotation.Demo;

/**
 * @author : Cyan_RA9
 * @version : 1.0
 */
class Test_EX {
    @Demo
    public void greet() {
        System.out.println("Hello!");
    }

    @Demo
    public void eat() {
        System.out.println("美汁儿美汁儿~");
    }
}

然后通过IDEA自带的生成javadoc的功能生成该测试类的javadoc文件,如下GIF图所示 :

可以看到,greet方法和eat方法的”@Demo“都保留在了生成的javadoc文件中。

4.”@Inherited“ :

①含义

Inherited就是继承的意思,如下所示 :

②使用

如果每个类使用了注解,而这种注解恰好被”@Inherited“元注解修饰,那么该类的子类同样会自动拥有父类的注解。


System.out.println("END-----------------------------------------------");

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/378108.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Kotlin学习:5.2、异步数据流 Flow

Flow一、Flow1、Flow是什么东西&#xff1f;2、实现功能3、特点4、冷流和热流5、流的连续性6、流的构建器7、流的上下文8、指定流所在协程9、流的取消9.1、超时取消9.2、主动取消9.3、密集型任务的取消10、背压和优化10.1、buffer 操作符10.2、 flowOn10.3、conflate 操作符10.…

Substrate 基础 -- 教程(Tutorials)

官网 github DOC 面向未来的区块链框架 Substrate 使开发人员能够快速、轻松地构建适合任何用例的未来 证明区块链(future proof blockchains)。 Substrate 文档包括区块链构建器&#xff08;blockchain builders&#xff09;和parachain 项目团队的概念、过程和参考信息。…

Nginx面试问题总结

1. 什么是Nginx&#xff1f;Nginx是一个 轻量级/高性能的反向代理Web服务器&#xff0c;他实现非常高效的反向代理、负载平衡&#xff0c;他可以处理2-3万并发连接数&#xff0c;官方监测能支持5万并发&#xff0c;现在中国使用nginx网站用户有很多&#xff0c;例如&#xff1a…

阿里淘宝新势力造型合伙人P8、年薪百万的欧阳娜娜也躲不过的魔鬼面试,看的我心服口服

阿里淘宝新势力造型合伙人P8、年薪百万的欧阳娜娜跳槽了&#xff0c;这不是关键。 她参加了网易有道明星语音录音员/代言人的面试&#xff0c;这也不是关键。 关键是她教科书式的面试过程&#xff0c;狠狠地给我们上了一课。 我是无意间刷到的这个视频的时候&#xff0c;就一…

u盘文件夹空的但u盘内存显示满的,怎么找回文件?

最近&#xff0c;我朋友抱怨自己的u盘满了&#xff0c;但是文件夹却是空空如也。他焦急地问我&#xff0c;这到底是怎么回事&#xff1f;我给他分析了一些常见的原因。首先&#xff0c;可能是因为u盘感染了病毒&#xff0c;将文件夹里面的文件隐藏了&#xff1b;其次&#xff0…

9大插件,21张配图,编码路上助你起飞

大家好&#xff0c;我是阿Q&#xff0c;很高兴又跟大家见面了。 看过我以往文章的小伙伴可能会发现&#xff0c;我的大部分文章都偏向于实战。我的文章风格也是先理论后实战&#xff0c;有了落地的理论才能帮助大家更好的理解。 最近有好多小伙伴后台私信我&#xff0c;问我有…

你问我答|虚拟机、容器和无服务器,怎么选?

在新技术层出不穷的当下,每家企业都希望不断降低成本,并提高运营效率,一个方法就是寻找不同的技术方案来优化运营。      例如,曾经一台服务器只能运行一个应用(裸机);接着,一台服务器的资源可以划分为多个块,从而运行多个应用(虚拟化);再到后来,应用越来越多,为了方便它们…

【牛客刷题专栏】0x0E:JZ6 从尾到头打印链表(C语言编程题)

前言 个人推荐在牛客网刷题(点击可以跳转)&#xff0c;它登陆后会保存刷题记录进度&#xff0c;重新登录时写过的题目代码不会丢失。个人刷题练习系列专栏&#xff1a;个人CSDN牛客刷题专栏。 题目来自&#xff1a;牛客/题库 / 在线编程 / 剑指offer&#xff1a; 目录前言问题…

互联网衰退期,测试工程师35岁之路怎么走...

国内的互联网行业发展较快&#xff0c;所以造成了技术研发类员工工作强度比较大&#xff0c;同时技术的快速更新又需要员工不断的学习新的技术。因此淘汰率也比较高&#xff0c;超过35岁的基层研发类员工&#xff0c;往往因为家庭原因、身体原因&#xff0c;比较难以跟得上工作…

Windows平台Unity Camera场景实现轻量级RTSP服务和RTMP推送

技术背景随着VR技术在医疗、军事、农业、学校、景区、消防、公共安全、研学机构、展厅展馆&#xff0c;商场等场所普及&#xff0c;开发者对Unity平台下的直播体验提出了更高的要求。技术实现Unity平台下的RTMP推流、RTMP、RTSP播放前几年已经覆盖了Windows、Linux、Android、i…

华为OD机试题,用 Java 解【内存资源分配】问题

最近更新的博客 华为OD机试题,用 Java 解【停车场车辆统计】问题华为OD机试题,用 Java 解【字符串变换最小字符串】问题华为OD机试题,用 Java 解【计算最大乘积】问题华为OD机试题,用 Java 解【DNA 序列】问题华为OD机试 - 组成最大数(Java) | 机试题算法思路 【2023】使…

蓝蓝算法二期工程day3,一万年太久,只争朝夕

思路&#xff1a; 最好想的是用hashmap&#xff0c;当然用c的话也可以用两个数组&#xff0c;一个数组用于存放字符串&#xff0c;自动对应ACSII码&#xff0c;一个将对应ACSII码的数字对应其下标&#xff0c;当然这也是用的映射的思想。 import java.util.*;public class Cac…

【蓝桥杯选拔赛真题38】python目标值判断 青少年组蓝桥杯python 选拔赛STEMA比赛真题解析

目录 python目标值判断 一、题目要求 1、编程实现 2、输入输出 二、解题思路

47个SQL性能优化技巧,看到就是赚到

1、先了解MySQL的执行过程 了解了MySQL的执行过程&#xff0c;我们才知道如何进行sql优化。 &#xff08;1&#xff09;客户端发送一条查询语句到服务器&#xff1b; &#xff08;2&#xff09;服务器先查询缓存&#xff0c;如果命中缓存&#xff0c;则立即返回存储在缓存中的…

Linux 内核 container_of 宏详解

目录 前言 1、container_of 宏介绍 2、container_of 宏的使用示例 3、container_of 宏实现原理分析 3.1 结构体在内存中的存储 3.2 计算成员变量在结构体内的偏移 3.3 container_of 宏的原理实现 4、总结 前言 本章内容会涉及到的基础知识有 typeof关键字 和 语句表达…

django-博客(一)

一、 1、环境&#xff1a;pycharm&#xff0c;python3.6&#xff0c;django3&#xff0c;mysql8.0 2、创建项目 3、把html和css样式那些导入到文件夹中&#xff0c;​​​​​​然后配置这些文件夹的路径&#xff0c;再添加首页视图。 改成反向解析 python manage.py runserv…

ElasticSearch 学习笔记总结(三)

文章目录一、ES 相关名词 专业介绍二、ES 系统架构三、ES 创建分片副本 和 elasticsearch-head插件四、ES 故障转移五、ES 应对故障六、ES 路由计算 和 分片控制七、ES集群 数据写流程八、ES集群 数据读流程九、ES集群 更新流程 和 批量操作十、ES 相关重要 概念 和 名词十一、…

熵,线性规划,半监督自监督聚类打标签

1.熵 信息熵是消除不确定性所需信息量的度量。 信息熵就是信息的不确定程度&#xff0c;信息熵越小&#xff0c;信息越确定。 对象的信息熵是正比于它的概率的负对数的&#xff0c;也就是 I©−log(pc) 其中n为事件的所有可能性。 为什么使用交叉熵&#xff1f;在机器学习…

分析设备故障时间和次数,打破生产瓶颈?包在虹科身上

前言 生产设备的稳定性和可靠性是保证企业正常生产的重要条件之一&#xff0c;设备故障的频发严重影响企业的正常生产&#xff0c;那么如何分析设备故障时间和次数&#xff0c;查找设备故障原因&#xff0c;协助企业打破生产瓶颈&#xff0c;有效地实现生产目标呢&#xff1f;…

面试总结——react生命周期

react生命周期总结 生命周期主要分为以下几个阶段&#xff1a; Mounting:创建虚拟DOM&#xff0c;渲染UI(初始化)Updating&#xff1a;更新虚拟DOM&#xff0c;重新渲染UI&#xff1b;(更新)UnMounting&#xff1a;删除虚拟DOM&#xff0c;移除UI&#xff1b;(销毁) 生命周期…