【JavaSE】注解

概念解释

注解与注释

注释:用文字描述程序的,是给程序员看的。

注解:用来解释说明程序的,是给计算机看的。

百度百科定义

注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,解释。

作用

①编写文档:通过代码里标识的注解生成文档【生成文档doc文档】。

doc文档就是java的API文档。java文件使用javadoc命令就可以生成doc文档,这个过程就会去解析java文件中那些文档的注解。

② 代码分析:通过代码里标识的注解对代码进行分析【使用反射】。

③编译检查:通过代码里标识的注解让编译器能够实现基本的编译检查。

比如使用@Override注解,编译器就会在编译时检查该方法是否重写父类的方法。

JDK中预定义的一些注解

1.@Override:检测被该注解标注的方法是否继承自父类(接口)的。

2.@Deprecated:该注解标注的内容表示已经过时,不推荐使用。

3.@SuppressWarnnings:压制警告。

自定义注解

自定义注解格式

@元注解
public @interface 注解名称{
    
}

注解的本质

将自定义注解的class文件进行反编译,如图

反编译的命令为 : javap class文件名

编译结果为:

public interface annotationdemo1.MyAnno extends java.lang.annotation.Annotation {
    
}

因此,注解的本质就是继承了Annotation的接口

属性

注解的属性其实就是注解中定义的抽象方法。注解中的抽象方法有一下要求:

1.属性返回值类型有以下取值:

  • 基本数据类型(8种)

  • String

  • 枚举

  • 注解

  • 以上类型的数组类型

2.定义了属性,在使用时需要给属性赋值

  • 如果定义属性时,使用default关键字给属性设置默认值,在使用时可以使用该默认值,也可赋值。

  • 如果属性唯一且属性的名称是value,则value可以省略,直接定义值即可。

  • 数组赋值时,值需要使用{}来包裹,其中元素之间用“,”隔开;如果只有一个值,则{}可以省略。

元注解

元注解就是自定义注解时,所用到的用来给自定义注解标注的注解

@Target:描述注解能够作用的位置。

Target注解中只有一个属性:ElementType[] value();ElementType是枚举类,有以下属性枚举:

public enum ElementType {
    
    TYPE, //表示可以声明在类、接口或枚举上
​
    FIELD,//表示可以声明字段(包括枚举常量)上
​
    METHOD,//表示可以声明在方法上
​
    PARAMETER,//表示可以声明在参数上
​
    CONSTRUCTOR,//表示可以声明在构造方法上
​
    LOCAL_VARIABLE,//表示可以声明在局部变量上
​
    ANNOTATION_TYPE,//表示可以声明在注释上
​
    PACKAGE,//表示可以声明包上
​
    TYPE_PARAMETER,//表示可以声明在类型参数上(从JKD1.8开始使用)
​
    TYPE_USE,//使用一种类型(从JKD1.8开始使用)
}

@Retention:描述注解能被保留的阶段。

Retention注解中只有一个属性:RetentionPolicy value();RetentionPolicy 是枚举类,有以下属性枚举:

public enum RetentionPolicy {
    
    SOURCE,//表示保留在源代码阶段
​
    CLASS,//表示保留在Class类对象阶段
​
    RUNTIME//表示保留在运行时阶段
}

@Documented:描述注解是否被抽取到API文档中。

@Inherited:描述注解是否被子类继承。

解析注解

使用反射机制来获取注解信息并进行解析:

@Application(className = "model.Teacher",methodName="teach")
public class AnnotationTest {
    public static void main(String[] args) throws Exception {
​
        //1.读取注解
        //1.1获取框架类的class对象
        Class<AnnotationTest> cls = AnnotationTest.class;
        //1.2根据类的class对象来获取注解
        Application annotation = cls.getAnnotation(Application.class);
        //1.3获取注解中的属性值:className、methodName
        String className = annotation.className();
        String methodName = annotation.methodName();
​
        //2.创建对象
        //2.1获取类的class对象
        Class clazz = Class.forName(className);
        //2.2创建对象
        Object obj = clazz.newInstance();
​
        //3.获取对象的方法
        Method method = clazz.getDeclaredMethod(methodName);
​
        //4.执行方法
        method.invoke(obj);
​
    }
}

解释:

在上述代码中的1.2步骤中,通过框架类的class对象获取注解对象时,会生成该注解的代理类(子类),并实现注解中的属性(抽象方法);代理对象实现抽象方法时,会读取框架类中使用的注解属性值并作为返回值。1.3步骤通过注解对象(代理)执行其中的方法就能获取到其返回值。根据其返回值,再根据反射机制,创建对象并执行方法。

生成的代理类长这样:

public class AnnotationImpl implements Application {
​
    @Override
    public String className() {
        return "model.Teacher";
    }
​
    @Override
    public String methodName() {
        return "teach";
    }
​
    /**
     * 因为注解继承了Annotation接口,所以必须实现该方法。
     */
    @Override
    public Class<? extends Annotation> annotationType() {
        return Application.class;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

FPGA常用IP核之FIFO学习

IP核是FPGA芯片公司提供的逻辑功能块&#xff0c;在FPGA芯片中可以进行优化和预先配置&#xff0c;可以直接在用户设计的程序中使用&#xff0c;应用范围很广。在FPGA设计开发过程中使用IP核&#xff0c;可以大大的缩短开发周期&#xff0c;高度优化的IP核可以使FPG开发工程师专…

8核32G云服务器幻兽帕鲁多人联机主机价格94元/月、1362元一年

8核32G云服务器京东云轻量云主机价格94元1个月、282元3个月、673元6个月、1362元一年&#xff0c;配置8C32G-100G SSD系统盘-10M带宽-2000G月流量 华北-北京&#xff0c;京东云优惠活动 yunfuwuqiba.com/go/jd 活动链接打开如下图&#xff1a; 8核32G云服务器京东云轻量云主机价…

损失函数篇 | YOLOv8更换损失函数之MPDIoU(23年7月首发论文)

前言:Hello大家好,我是小哥谈。损失函数是机器学习中用来衡量模型预测值与真实值之间差异的函数。在训练模型时,我们希望通过不断调整模型参数,使得损失函数的值最小化,从而使得模型的预测值更加接近真实值。不同的损失函数适用于不同的问题,例如均方误差损失函数适用于回…

Codeforces Round 931 (Div. 2) D1. XOR Break — Solo Version

题目 思路&#xff1a; #include <bits/stdc.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 const int maxn 1e6 5, inf 1e18, maxm 4e4 5; c…

机器学习综述:核心概念、方法与未来展望

一、机器学习基础 基本概念 机器学习是一门专注于开发算法来从数据中学习模式的科学。它基于这样一个假设&#xff1a;如果一个程序可以在某任务T上&#xff0c;基于经验E改善它的性能P&#xff0c;那么我们说这个程序在从经验中学习。这里的“经验”可以理解为历史数据或先前…

腾讯云服务器优惠活动价格表_CPU内存带宽报价明细

2024年最新腾讯云服务器租用优惠价格表&#xff1a;轻量应用服务器2核2G3M价格62元一年、2核2G4M价格118元一年&#xff0c;540元三年、2核4G5M带宽218元一年&#xff0c;2核4G5M带宽756元三年、轻量4核8G12M服务器646元15个月&#xff1b;轻量4核16G12M带宽32元1个月、96元3个…

基于python爬虫与数据分析系统设计

**单片机设计介绍&#xff0c;基于python爬虫与数据分析系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于Python爬虫与数据分析系统的设计是一个结合了网络数据抓取、清洗、存储和数据分析的综合项目。这样的系统通常…

【网站项目】三省学堂-学习辅助系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

Win10 下 Vision Mamba(Vim-main)的环境配置(libcuda.so文件无法找到,windows系统运行失败)

目录 1、下载NVIDIA 驱动程序、cuda11.8、cudnn8.6.0 2、在Anaconda中创建环境并激活 3、下载gpu版本的torch 4、配置环境所需要的包 5、安装causal_conv1d和mamba-1p1p1 安装causal_conv1d 安装mamba-1p1p1 6、运行main.py失败 请直接拉到最后查看运行失败的原因&am…

【C++】vector模拟实现

目录 简介&#xff1a;私有成员&#xff1a;迭代器&#xff1a; 无参构造函数&#xff1a;push_back&#xff1a;reserve&#xff1a;resize:push_back: operator[]重载&#xff1a;begin && end:size && capacity:insert&#xff1a;erase&#xff1a;带参构造…

PyQt ui2py 使用PowerShell将ui文件转为py文件并且将导入模块PyQt或PySide转换为qtpy模块开箱即用

前言 由于需要使用不同的qt环境&#xff08;PySide&#xff0c;PyQt&#xff09;所以写了这个脚本&#xff0c;使用找到的随便一个uic命令去转换ui文件&#xff0c;然后将导入模块换成qtpy这个通用库(支持pyside2-6&#xff0c;pyqt5-6)&#xff0c;老版本的是Qt.py(支持pysid…

论文阅读——Sat2Vid

Sat2Vid: Street-view Panoramic Video Synthesis from a Single Satellite Image 提出了一种新颖的方法&#xff0c;用于从单个卫星图像和摄像机轨迹合成时间和几何一致的街景全景视频。 即根据单个卫星图像和给定的观看位置尽可能真实地、尽可能一致地合成街景全景视频序列。…

Python+Django+Html河道垃圾识别网页系统

程序示例精选 PythonDjangoHtml河道垃圾识别网页系统 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《PythonDjangoHtml河道垃圾识别网页系统》编写代码&#xff0c;代码整洁&#xff0c;规…

如何编写属于自己的第一个exp

0x00 前言 在我们找到一个漏洞之后&#xff0c;可能会想着去fofa上搜语法进而扩大战果&#xff0c;而有些漏洞利用起来十分繁琐&#xff0c;这时候就需要一个exp来批量帮我们进行扫描工作&#xff0c;接下来就介绍一下如何进行exp的编写&#xff0c;这个过程中最重要的还是体现…

Docker简单介绍、特点、与虚拟机技术的区别、核心概念及在CentOS 7 中安装卸载Docker

目录 一、什么是Docker 二、特点 三、Docker与虚拟机技术的区别 四、Docker的核心概念 Docker仓库与仓库注册服务器的区别 五、CentOS7在线安装Docker 安装配置 卸载 一、什么是Docker Docker是一个开源的容器化平台&#xff0c;用于打包、部署和运行应用程序。它利用…

AI设计优化电机、电路与芯片?

一、AI进行电机本体设计 使用AI进行电机本体设计是一种前沿且具有潜力的方法&#xff0c;通过深度学习、强化学习、遗传算法等AI技术&#xff0c;可以实现电机设计的自动化和优化。具体应用可以包括以下几个方面&#xff1a; 此图片来源于网络 1. **参数优化**&#xff1a; …

硬件基础知识

CPU制作 cpu组成原理 CPU (Central Processing Unit - 中央处理单元): CPU 是计算机的核心&#xff0c;负责解释和执行程序指令以及处理数据。它由几个关键部分组成&#xff0c;如算术逻辑单元&#xff08;ALU&#xff09;、寄存器、和控制单元&#xff08;CU&#xff09;&…

游戏攻略|基于Springboot和vue的游戏分享平台系统设计与实现(源码+数据库+文档)

游戏攻略分享平台目录 基于Springboot的在线考试管理系统设计与实现 一、前言 二、系统设计 三、系统功能设计 1、前台&#xff1a; 2、后台 5.2.1管理员功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; …

国际体育日,一起运动起来吧

今天是国际体育日&#xff0c;是时候动一动&#xff0c;燃烧我们的卡路里啦&#xff01;说到运动&#xff0c;我得提提最近刚入手华为WATCH GT4&#xff0c;真心不赖&#xff01; 这个手表特别适合喜欢运动的人&#xff0c;它有100的运动模式&#xff0c;无论你是喜欢跑步、…

数据结构初阶:顺序表和链表

线性表 线性表 ( linear list ) 是 n 个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使 用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串 ... 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的, 线性…