Java注解

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 一、在编译时进行格式检查(JDK内置的三个基本注解)
  • 二、使用步骤
    • 1.理解Annotation
    • 2.Annocation的使用示例
    • 3.如何自定义注解
    • 4.jdk 提供的4种元注解
    • 5.通过反射获得注解信息
    • 6.jdk 8 中注解的新特性: 可重复注解、类型注解
      • 6.1 可重复注解
      • 6.2 类型注解
    • 7.元注解
  • 三、代码案例
    • 1.自定义注解
    • 2.JDK内置的三个基本注解


提示:以下是本篇文章正文内容,下面案例可供参考

一、在编译时进行格式检查(JDK内置的三个基本注解)

在这里插入图片描述

二、使用步骤

1.理解Annotation

① jdk 5.0 新增的功能
② Annotation,其实就是代码里的特殊标记,这些标记可以在编译,类加载,运行时被读取,并执行相关操作,程序员可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充信息。

2.Annocation的使用示例

示例一: 生成文档相关的注解
示例二: 在编译时进行格式检查(JDK内置的三个基本注解)
@Override: 限定重写父类方法,该注解只能用于方法@Deprecated: 用于表示所修饰的元素(类,方法等)已过时。@SuppressWarnings: 抑制编译器警告

示例三: 跟踪代码依赖性,实现替代配置文件功能

3.如何自定义注解

参照@SuppressWarning定义
① 注解声明为: @interface
②内部定义成员,通常使用value表示
③可以指定成员的默认值,使用default 定义
④如果自定义注解没有成员,表明是一个标识作用

如果注解有成员,在使用注解时,需要指明成员的值。
自定义注解必须配上注解的信息处理流程( 使用反射)才有意义。
自定义注解通过都会指明两个元注解: Retention、Target

4.jdk 提供的4种元注解

元注解:对现有的注解进行解释说明的注解
Retention: 指定所修饰的 Annotation 的生命周期: SOURCE\CLASS (默认行为)\RUNTIME
只有声明为RUNTIME生命周期的注解,才能通过反射获得。
Target: 用于指定被修饰的 Annotation 能用于修饰哪些程序元素
Documented:表示所修施的注解在被iavadoc 解析时,保留下来
Inherited:被它修饰的 Annotation 将具有继承性

5.通过反射获得注解信息

6.jdk 8 中注解的新特性: 可重复注解、类型注解

6.1 可重复注解

1.在MyAnnotation上声明@Repeatable,成员值为MyAnnotations.class
2.MyAnnotation的Target和Retentiond等元注解与MyAnnotations相同.

6.2 类型注解

ElementType.TYPE_PARAMETER 表示该注解能写在类型变量的声明语句中(如:泛型声明)
ELementType.TYPE_USE 表示该注解能写在使用类型的任何语句中。

7.元注解

元注解:对现有的注解进行解释说明的注解。

三、代码案例

1.自定义注解

package com.tyust.edu;import java.lang.annotation.*;import static java.lang.annotation.ElementType.*;/*** 自定义注解* @author YML TYUST-XDU 2019-2026* @create 2023-10-09 10:22*/
@Inherited
@Repeatable(MyAnnotations.class)
@Retention(RetentionPolicy.RUNTIME)
@Target({TYPE, FIELD,METHOD,PARAMETER,CONSTRUCTOR,LOCAL_VARIABLE,TYPE_PARAMETER,TYPE_USE})
public @interface MyAnnotation {
//    String[] value();String[] value() default "hello";
}
package com.tyust.edu;import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.ElementType.LOCAL_VARIABLE;/*** @author YML TYUST-XDU 2019-2026* @create 2023-10-09 10:57*/
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({TYPE, FIELD,METHOD,PARAMETER,CONSTRUCTOR,LOCAL_VARIABLE})
public @interface MyAnnotations {MyAnnotation[] value();
}

2.JDK内置的三个基本注解

package com.tyust.edu;import org.junit.Test;import java.lang.annotation.Annotation;
import java.util.ArrayList;
import java.util.Date;/*** JDK内置的三个基本注解* @author YML TYUST-XDU 2019-2026* @create 2023-10-09 10:08*/
public class AnnotationTest {public static void main(String[] args) {Person p = new Student();p.walk();//        @Deprecated
//@Contract(pure = true)
//public Date(     int year,
//        @MagicConstant(intValues = {Calendar.JANUARY,Calendar.FEBRUARY,Calendar.MARCH,Calendar.APRIL,Calendar.MAY,Calendar.JUNE,Calendar.JULY,Calendar.AUGUST,Calendar.SEPTEMBER,Calendar.OCTOBER,Calendar.NOVEMBER,Calendar.DECEMBER})  int month,
//        int date )Date date = new Date(2023,20,9);System.out.println(date);@SuppressWarnings("unused")int num = 10;}//通过反射获取注解信息@Testpublic void testGetAnnotation(){Class clazz = Student.class;Annotation[] annotations = clazz.getAnnotations();for (int i = 0; i <annotations.length; i++) {System.out.println(annotations[i]);}}}//@MyAnnotation(value = "hello")
//jdk8之前的写法
//@MyAnnotations({@MyAnnotation(value = "hello"),@MyAnnotation(value = "hi")})
@MyAnnotation(value = "hello")
@MyAnnotation(value = "hi")
class  Person{String name;int age;public Person(){}public Person(String name,int age){this.name = name;this.age = age;}public void walk(){System.out.println("人走路");}public void eat(){System.out.println("人吃饭");}}interface Info1{void show();
}class Student extends Person implements Info1{@Overridepublic void walk() {System.out.println("学生走路");}@Overridepublic void show() {}
}class Generic<@MyAnnotation T>{public void show()throws @MyAnnotation RuntimeException{ArrayList<@MyAnnotation String> list = new ArrayList<>();int num = (@MyAnnotation int)10L;}}

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

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

相关文章

如何更好的使用结构化工艺文件编制软件?——青创智通

青创智通结构化工艺文件编制软件包括文件创建、文件编制、文件修改、文件复制、文件引用、标准文件库、工艺路线、工艺资源库管理、审批管理、文件导出、文件清单汇总、接口管理等功能。具有以下优势及亮点。 1.集中工艺数据管理 以PLM系统平台为核心的结构化工艺数据支撑平台…

Android 源码解析: SharedPreferences的解析

Android源码解析&#xff1a;SharedPreferences的解析 导言 SharedPreferences是Android中的一种轻量的数据持久化手段&#xff0c;可能也是我们在学习Android时接触到的第一种特殊的本地数据持久化手段&#xff0c;本篇文章就将从源码角度分析SharedPreferences的原理。 源…

android 修改输出apk的包名

一&#xff0c;打包方式使用IDE菜单选项 二、在app级别的build.gradle下配置&#xff1a; static def releaseTime() {return new Date().format("yyyyMMdd.kkmm", TimeZone.getTimeZone("GMT8")) }android.applicationVariants.all { variant ->print…

怎么压缩pdf文件?分享缩小pdf文件的简单方法

在我们的日常生活和工作中&#xff0c;往往需要处理大量的PDF文件&#xff0c;而很多时候这些文件的大小会成为传输和存储的难题。为了解决这个问题&#xff0c;下面我们将介绍三种方法来压缩PDF文件&#xff0c;一起来看看吧~ 一、嗨格式压缩大师 首先&#xff0c;最简单也是…

CSS 实现:常见布局

1 设备与视口 设备屏幕尺寸是指屏幕的对角线长度。像素是计算机屏幕能显示一种特定颜色的最小区域&#xff0c;分为设备像素和逻辑像素。 在 Apple 的视网膜屏&#xff08;Retina&#xff09;中&#xff0c;默认每 4 个设备像素为一组&#xff0c;渲染出普通屏幕中一个像素显示…

buuctf-[BSidesCF 2020]Had a bad day 文件包含

打开环境 就两个按钮&#xff0c;随便按按 url变了 还有 像文件包含&#xff0c;使用php伪协议读取一下&#xff0c;但是发现报错&#xff0c;而且有两个.php,可能是自己会加上php后缀 所以把后缀去掉 /index.php?categoryphp://filter/convert.base64-encode/resourcei…

【APP】上架指南:iOS App Store 首次上架被拒原因分析与解决方案

目录 一、前言 二、APP 审核备案新规 &#xff08;1&#xff09;iOS 上架审核申请被拒 &#xff08;2&#xff09;苹果应用商店重大调整 &#xff08;3&#xff09;首次备案流程 ① 阿里云备案 ② 华为云备案 ③ 腾讯云备案 三、iOS 首次上架拒审原因分析 &#…

[羊城杯 2020]easyser - 反序列化+SSRF+伪协议(绕过死亡die)

[羊城杯 2020]easyser 一、解题过程&#xff08;一&#xff09;、一阶段&#xff08;二&#xff09;、二阶段 二、思考总结 一、解题过程 &#xff08;一&#xff09;、一阶段 可以直接使用ctf-wscan扫描一下有什么文件&#xff0c;或者直接试试robots.txt能不能行 直接打开…

【算法训练-数组 三】【数组矩阵】螺旋矩阵、旋转图像、搜索二维矩阵

废话不多说&#xff0c;喊一句号子鼓励自己&#xff1a;程序员永不失业&#xff0c;程序员走向架构&#xff01;本篇Blog的主题是螺旋矩阵&#xff0c;使用【二维数组】这个基本的数据结构来实现 螺旋矩阵【EASY】 二维数组的结构特性入手 题干 解题思路 根据题目示例 mat…

用《斗破苍穹》的视角打开C#3 标签与反射(人物创建与斗技使用)

随着剧情的发展&#xff0c;主线人物登场得越来越多&#xff0c;时不时跳出一个大佬&#xff0c;对我张牙舞爪地攻击。眼花缭乱的斗技让我不厌其烦&#xff0c;一个不小心&#xff0c;我就记不清楚在哪里遇上过什么人&#xff0c;他会什么斗技了。这时候&#xff0c;我就特别希…

通过IP地址管理提升企业网络安全防御

在今天的数字时代&#xff0c;企业面临着越来越多的网络安全威胁。这些威胁可能来自各种来源&#xff0c;包括恶意软件、网络攻击和数据泄露。为了提高网络安全防御&#xff0c;企业需要采取一系列措施&#xff0c;其中IP地址管理是一个重要的方面 1. IP地址的基础知识 首先&a…

华为数通方向HCIP-DataCom H12-831题库(单选题:221-240)

第221题 以下哪些项能被正则表达式^30.成功匹配? A、200 100 300 B、100 200 300 C、300 200 100 D、300 100 200 答案:CD 解析: 30.其中的“点”表示的是任何的一个数字,表示的是as-path的开头;所以以300开头的都是满足题目需求的。 第222题 以下哪些项的Community属性能…

安卓 Android 终端接入阿里云 IoT 物联网平台

在全球智能手机市场里&#xff0c;谷歌开发的安卓(Android)移动操作系统市场占有率已经高达90%。随着物联网智能硬件升级&#xff0c;安卓(Android)也逐渐成为智能摄像头&#xff0c;智能对讲门禁&#xff0c;人脸识别闸机&#xff0c;智能电视&#xff0c;智能广告屏等带屏 Io…

Android多线程学习:线程

一、概念 进程&#xff1a;系统资源分配的基本单位&#xff0c;进程之间相互独立&#xff0c;不能直接访问其他进程的地址空间。 线程&#xff1a;CPU调度的基本单位&#xff0c;线程之间共享所在进程的资源&#xff0c;包括共享内存&#xff0c;公有数据&#xff0c;全局变量…

Java虚拟机内存模型

JVM虚拟机将内存数据分为&#xff1a; 程序计数器、虚拟机栈、本地方法栈、Java堆、方法区等部分。 程序计数器用于存放下一条运行的指令&#xff1b; 虚拟机栈和本地方法栈用于存放函数调用堆栈信息&#xff1b; Java堆用于存放Java程序运行时所需的对象等数据&#xff1b…

webpack不同环境下使用CSS分离插件mini-css-extract-plugin

1.背景描述 使用mini-css-extract-plugin插件来打包css文件&#xff08;从css文件中提取css代码到单独的文件中&#xff0c;对css代码进行代码压缩等&#xff09;。 本次采用三个配置文件&#xff1a; 公共配置文件&#xff1a;webpack.common.jsdev开发环境配置文件&#x…

接口测试及常用接口测试工具

首先&#xff0c;什么是接口呢&#xff1f; 接口一般来说有两种&#xff0c;一种是程序内部的接口&#xff0c;一种是系统对外的接口。 系统对外的接口&#xff1a;比如你要从别的网站或服务器上获取资源或信息&#xff0c;别人肯定不会把数据库共享给你&#xff0c;他只能给你…

maven 初学

1. maven 安装 配置安装 路径 maven 下载位置: D:\software\apache-maven-3.8.6 默认仓库位置: C:\Users\star-dream\.m2\repository 【已更改】 本地仓库设置为&#xff1a;D:\software\apache-maven-3.8.6\.m2\repository 镜像已更改为阿里云中央镜像仓库 <mirrors>…

算法通过村第十二关-字符串|黄金笔记|冲刺难题

文章目录 前言最长公共前缀纵向比较横向比较 字符串压缩问题表示数值的字符串总结 前言 提示&#xff1a;我有时候在想&#xff0c;我是真的不太需要其他人&#xff0c;还是因为跟他们在一起时没法自己&#xff0c;所以才保持距离。我们的交谈就像是平行而毫无交集的自言自语。…

Python—Scrapy实践项目

爬取豆瓣电影2022年Top250部经典电影 1.项目概述 从https://movie.douban/top250爬取电影的标题、评分、主题。我在之前使用普通的爬虫实现了类似的功能&#xff0c;可以对比来进行学习&#xff08;Python爬虫——爬虫基础模块和类库&#xff08;附实践项目&#xff09;&#…