重学java 83.Java注解

As a failure,I met my last sound.

                                        —— 24.6.24

一、注解的介绍

1.引用数据类型:

        类、数组、接口、枚举、注解

jdk1.5版本的新特性

        一个引用数据类型

        和类,接口,枚举是同一个层次的

        引用数据类型:类、数组、接口、枚举、注解

2.作用:

        ① 说明:对代码进行说明,生成doc文档(API文档)

        ② 检查:检查代码是否符合条件     @override(重写)     @FunctionalInterface(函数式接口)

        ③ 分析:对代码进行分析,起到了代替配置文件的作用(会用)

3.JDK中的注解:

        @override ——> 检测此方法是否为重写方法
                jdk1.5版本,支持父类的方法重写
                jdk1.6版本,支持接口的方法重写

        @Deprecated ——>方法已经过时,不推荐使用

                调用方法的时候,方法上会有横线,但是能用

        @suppressWarnings ——> 消除警告        @suppressWarnings("all")

import java.util.ArrayList;
@SuppressWarnings("all")
public class Demo343Test01 {public static void main(String[] args) {Person person = new Person();person.eat();System.out.println("——————————————————————————");ArrayList list = new ArrayList();list.add(new Person());}
}
public class Person {@Deprecatedpublic void eat(){System.out.println("人要吃饭");}
}

二、注解的定义以及属性的定义格式

注解属性:本质上是抽象方法

1.定义

public @interface 注解名{}

2.定义属性(抽象方法)

增强注解的作用

数据类型 属性名() ——> 此属性没有默认值,需要在使用注解的时候为其赋值

数据类型 属性名()defaut值->此属性有默认值,如果有需要,还可以二次赋值

3.注解定义中的属性类型

        a、八种基本类型

        b、String类型,class类型,枚举类型,注解类型

        c、以及以上类型的一维数组

public @interface Book {// 书名String bookName();// 作者String[] author();// 价格int price();// 数量 default 默认值 10本int count() default 10;
}

三、注解的使用

1.注解的使用:

        为注解中的属性赋值

2.使用位置上:

        在类上使用,方法上使用,成员变量上使用,局部变量上使用,参数位置使用等

3.使用格式:

a、@注解名(属性名=值,属性名=值...)
b、如果属性中有数组:@注解名(属性名={元素1,元素2...})

@Book(bookName = "云边有个小卖部",author = "张嘉译",price = 10,count = 11)
public class BookShelf {
}

4.注解注意事项:

        ① 空注解可以直接使用 --> 空注解就是注解中没有任何的属性

        ② 不同的位置可以使用一样的注解,但是同样的位置不能使用一样的注解

        ③ 使用注解时,如果此注解中有属性,注解中的属性一定要赋值,如果有多个属性,用,隔开
如果注解中的属性有数组,使用{}

        ④ 如果注解中的属性值有默认值,那么我们不必要写,也不用重新赋值,反之必须写上

        ⑤ 如果注解中只有一个属性,并且属性名叫value,那么使用注解的时候,属性名不用写,直接写值(包括单个类型,还包括数组)

@Book(bookName = "云边有个小卖部",author = "张嘉译",price = 10,count = 11)
public class BookShelf {
}

四、注解的解析 ——> AnnotatedElement接口

注解的解析:说白了就是将注解中的属性值获取出来

1.注解解析涉及到的接口:

        AnnotatedElement接口

实现类:AccessibleObject、Class、Constructor、 Executable、 Field、 Method、 Package、Parameter

2.解析思路:

        先判断指定位置上有没有使用指定的注解,如果有,获取指定的注解,获取注解中的属性值

        a、boolean isAnnotationPresent(class<? extends Annotation> annotationClass) ——> 判断指定位置上有没有指定的注解

        比如:判断Bookshelf上有没有Book注解

        Class bookshelf=Bookshelf.classbookshelf.isAnnotationPresent(Book.class)
        b、getAnnotation(Class<T> annotationclass) ——> 获取指定的注解,返回值类型为获取的注解类型

        比如:获取Bookshelf上的Book注解
        Class bookshelf = Bookshelf.class

        boolean result = bookshelf.isAnnotationPresent(Book.class)

        如果resut为true,证明Bookshelf上有Book注解,那就获取

        Book book =bookshelf.getAnnotation(Book.class)

BOOK接口

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target({ElementType.TYPE,ElementType.METHOD,ElementType.FIELD, ElementType.PARAMETER,ElementType.LOCAL_VARIABLE,ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Book {// 书名String bookName();// 作者String[] author();// 价格int price();// 数量 default 默认值 10本int count() default 10;
}

书籍信息类        

@Book(bookName = "云边有个小卖部",author = "张嘉译",price = 27,count = 11525)
public class BookShelf {
}

 主函数

import java.util.Arrays;public class Demo344Test {public static void main(String[] args) {// 1.获取BookShelf的class对象Class<BookShelf> bookShelfClass = BookShelf.class;// 2.判断bookShelf上有没有Book注解boolean b = bookShelfClass.isAnnotationPresent(Book.class);// 如果b为true,就获取if (b){Book book = bookShelfClass.getAnnotation(Book.class);System.out.println(book.bookName());System.out.println(Arrays.toString(book.author()));System.out.println(book.price());System.out.println(book.count());}}
}

以上代码没有解析出来

原因:Book注解有可能就没有在内存中出现

五、元注解

1.概述:

        元注解就是管理注解的注解

2.管理注解的方式:

        a、控制注解的使用位置

                ① 控制注解是否能在类上使用

                ② 控制注解是否能在方法上使用

                ③ 控制注解是否能在构造上使用等

        b、控制注解的加载位置(生命周期)

                ① 控制注解是否能在源码中出现

                ② 控制注解是否能在class文件中出现控制

                ③ 注解是否能在内存中出现

3.使用

        a、@Target:控制注解的使用位置

        属性:ElementType[] value();

                ElementType是一个枚举,里面的成员可以类名直接调用

        ElementType中的成员:

                TYPE:控制注解能使用在类上

                FIELD:控制注解能使用在属性上

                METHOD:控制注解能使用在方法上

                PARAMETER:控制注解能使用在参数上

                CONSTRUCTOR:控制注解能使用在构造上

                LOCAL_VARIABLE:控制注解能使用在局部变量上

        b、@Retention:控制注解的生命周期(加载位置)

        属性:RetentionPoicy value();

                RetentionPolicy是一个枚举,里面的成员可以类名直接调用

        RetentionPolicy中的成员:

                SOURCE:控制注解能在源码中出现 ——> 默认

                CLASS:控制注解能在class文件中出现

                RUNTIME:控制注解能在内存中出现

BOOK接口

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target({ElementType.TYPE,ElementType.METHOD,ElementType.FIELD, ElementType.PARAMETER,ElementType.LOCAL_VARIABLE,ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Book {// 书名String bookName();// 作者String[] author();// 价格int price();// 数量 default 默认值 10本int count() default 10;
}

书籍信息类        

@Book(bookName = "云边有个小卖部",author = "张嘉译",price = 27,count = 11525)
public class BookShelf {
}

主函数

import java.util.Arrays;public class Demo344Test {public static void main(String[] args) {// 1.获取BookShelf的class对象Class<BookShelf> bookShelfClass = BookShelf.class;// 2.判断bookShelf上有没有Book注解boolean b = bookShelfClass.isAnnotationPresent(Book.class);// 如果b为true,就获取if (b){Book book = bookShelfClass.getAnnotation(Book.class);System.out.println(book.bookName());System.out.println(Arrays.toString(book.author()));System.out.println(book.price());System.out.println(book.count());}}
}

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

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

相关文章

elementui组件库实现电影选座面板demo

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Cinema Seat Selection</title><!-- 引入E…

前端中的深拷贝

第1部分&#xff1a;引言 深拷贝&#xff1a;前端开发的隐形守护者 在前端开发的世界里&#xff0c;数据的传递和状态的管理是构建用户界面的基础。然而&#xff0c;数据的复制常常被忽视&#xff0c;直到它引发bug&#xff0c;我们才意识到它的重要性。深拷贝&#xff0c;这…

122.网络游戏逆向分析与漏洞攻防-邮件系统数据分析-邮件物品箱的管理

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果&#xff0c;代码看不懂是正常的&#xff0c;只要会抄就行&#xff0c;抄着抄着就能懂了 内容…

【论文精读】ViM: Out-Of-Distribution with Virtual-logit Matching 使用虚拟分对数匹配的分布外检测

文章目录 一、文章概览&#xff08;一&#xff09;问题来源&#xff08;二&#xff09;文章的主要工作&#xff08;三&#xff09;相关研究 二、动机&#xff1a;Logits 中缺失的信息&#xff08;一&#xff09;logits&#xff08;三&#xff09;基于零空间的 OOD 评分&#xf…

你还在手动操作仓库?这款 CLI 工具让你效率飙升300%!

前言 作为一名开发者&#xff0c;我经常会在 GitHub 和 Gitee 上 fork 各种项目。时间一长&#xff0c;这些仓库就会堆积如山&#xff0c;变成了“垃圾仓库”。每次打开代码托管平台&#xff0c;看到那些不再需要的仓库&#xff0c;我的强迫症就会发作。手动一个一个删除这些仓…

统计学三学习笔记

一&#xff0c;t分布 二&#xff0c;置信区间 最终要用② n越大&#xff0c;s越小&#xff0c;置信区间越小 三&#xff0c;配对样本t检验 假如有两个族群&#xff1a;

【Godot4自学手册】第四十二节实现拖拽进行物品交换和数量叠加

这一节我们主要学习背包系统中的物品拖拽后&#xff0c;物品放到新的位置&#xff0c;或交换物品位置&#xff0c;如果两个物品属于同一物品则数量相加。具体效果如下&#xff1a; 一、修改item.tscn场景 给item.tscn场景的根节点Item添加Label子节点&#xff0c;命名为Numv…

Linux CentoS安装RabbitMQ:一键安装指南

有两种安装方法&#xff0c;官方推荐使用 docker安装RabbitMQ 一、Docker安装RabbitMQ 1、安装docker 参考我之前的文章&#xff1a;Centos7.5搭建docker并且部署Lnmp环境&#xff08;小白入门docoker&#xff09;_centos7.5安装docker和docker-compose-CSDN博客 2、安装Ra…

【实用软件】Paragon NTFS for Mac 15下载及安装教程

​习惯上来说所有操作只需轻轻一点&#xff1a;轻量级的快捷菜单栏&#xff0c;可访问所有NTFS驱动器并执行最常见的卷操作&#xff0c;如挂载&#xff0c;卸载和验证&#xff0c;从菜单栏中快速启动NTFS for Mac界面&#xff0c;一键点击&#xff0c;更加方便。11510182322410…

Scope XY Project的使用

1.Scope XY Project的功能介绍与使用方法 添加监控变量 绘制成一个三角形 XY进行对调操作 修改XY轴的比例修改显示输出 2.Cursor的使用方法 游标线的添加测量 3.Reporting功能的使用方法 到处对应的报表数据 添加对应的报告数据

一、Jquery入门(超详)

* [5.3 jQuery 对象和 DOM 对象之间的相互转换](about:blank#53_jQuery__DOM__271)* * [5.3.1 jQuery 对象转换为 DOM 对象](about:blank#531_jQuery__DOM__282)* [5.3.2 DOM 对象转换为 jQuery 对象](about:blank#532_DOM__jQuery__295)六、 解决 jQuery 和其他库的冲…

Linux:基础IO(三.软硬链接、动态库和静态库、动精态库的制作和加载)

上次介绍了基础IO&#xff08;二&#xff09;&#xff1a;Linux&#xff1a;基础IO&#xff08;二.缓冲区、模拟一下缓冲区、详细讲解文件系统&#xff09; 文章目录 1.软硬链接1.1硬链接1.2软链接使用场景 2.动态库和静态库1.1回顾1.2静态库的制作和使用为什么要有库制作者角度…

毫米波移动通信系统中的波束赋形—模数混合的波束赋形架构

模数混合的波束赋形将波束赋形分为了模拟波束赋形与数字波束赋形两部分&#xff0c;其模拟部分通过移相器实现&#xff0c;数字部分通过基带预编码实现&#xff0c;&#xff0c;其结构如图2所示。当射频链路数目NRF为1时&#xff0c;认为其是一种特殊的模数混合的波束赋形。 此…

【计算机视觉】人脸算法之图像处理基础知识【七】

直方图均衡化 直方图均衡化是一种常用的图像处理技术&#xff0c;用于改善图像的对比度&#xff0c;特别是在图像的细节被埋没在暗部或亮部区域时。通过重新分配图像的像素强度值&#xff0c;使得图像的整体对比度增强&#xff0c;从而让更多的细节变得可见。 import cv2 imp…

IO-Iink事件

IO-LINK事件功能 IO-Link的事件功能是其通信协议中的一项重要特性&#xff0c;主要用于传输设备的故障信息和维护信息。IO-Link支持三种数据类型&#xff1a;过程数据、参数数据和事件数据。其中&#xff0c;事件数据就是用于此目的。 当IO-Link设备&#xff08;如传感器或执…

NepnepxCATCTF Pwn-Chao

文章目录 参考类型混淆异常处理的栈回退机制虚表和类的恢复假想的程序结构逆向工程场景步骤解析 idabug检查找虚表strupsc_str()alloca异常逆向maindisplayupdatecreate 新东西exp和思路 参考 https://www.cnblogs.com/winmt/articles/17018284.html 类型混淆 关于C中由虚函…

HarmonyOS Next开发学习手册——应用启动框架AppStartup

概述 AppStartup提供了一种简单高效的初始化组件的方式&#xff0c;开发者可以使用AppStartup来显示的设置组件的初始化顺序以及之间的依赖关系&#xff0c;支持异步初始化组件加速应用的启动时间。开发者需要分别为待初始化的组件实现AppStartup提供的 StartupTask 接口&…

DeepSeek-Coder-v2击败GPT-4 Turbo,成为竞技场最强开源编码模型!

目录 01 编码与数学击败GPT-4 Turbo 02 深度求索&#xff1a;价格战的导火索 就在刚刚&#xff0c;竞技场排名再次刷新&#xff1a;深度求索的DeepSeek-Coder-v2成为竞技场最强开源编码模型&#xff01; 它在Coding Arena中已攀升至第4名&#xff0c;水平接近GPT-4 Turbo。 没…

Latex学习之“usefont”用法

Latex学习之“\usefont”用法 一、通俗的解释 \usefont 是 LaTeX 中的一个命令&#xff0c;用于在文档中临时改变字体&#xff0c;其基本语法如下&#xff1a; \usefont{字体编码}{字体族}{字体系列}{字体形状}这样看起来好像蛮抽象&#xff0c;你可能以及晕了&#xff0c;什…

Arduino称重传感器和 HX711 放大器(数字秤)

Arduino称重传感器和 HX711 放大器&#xff08;数字秤&#xff09; Arduino with Load Cell and HX711 Amplifier (Digital Scale) In this guide, you’ll learn how to create a digital scale with the Arduino using a load cell and the HX711 amplifier. First, you’l…