Java高级-注解

注解

  • 1.介绍
  • 2.元注解
  • 3.注解的解析
  • 4.注解的应用场景

1.介绍

注解 Annotation

  • 就是Java代码里的特殊标记,作用是让其他程序根据注解信息来决定什么是执行该程序
  • 注解:注解可以在类上、构造器上、方法上、成员变量上、参数上等位置

自定义注解

/*** 自定义注解*/
public @interface MyTest1 {String aaa();boolean bbb() default true;String[] ccc();
}

特殊属性名:value

  • 如果注解中只有一个vlue属性,使用注解时,value名称可以不写
public @interface MyTest2 {String value(); // 特殊属性
}

注解的原理

  • 注解本质是一个接口,Java中所有的注解都是继承了Annotation接口的
  • @注解(…): 其实就是一个实现类对象,实现了该注解以及Annotation接口
    在这里插入图片描述

2.元注解

元注解

  • 指的是:修饰注解的注解
  • @Target 声明被修饰的注解在哪些位置使用
    • 类,成员变量,成员方法,成员参数,构造器,局部变量
  • @Retention 声明注解的保留周期
    • SOURCE 只作用在源码阶段,字节码文件中不存在
    • CLASS (默认值)保留到字节码文件阶段,运行阶段不存在
    • RUNTIME (开发常用)一直保留到运行解阶段

3.注解的解析

什么是注解的解析

  • 就是判断类上、方法上、成员变量上是否存在注解,并把注解里的内容给解析出来

如何解析注解

  • 指导思想:要解析谁上面的注解,就应该先拿到谁
  • 比如要解析类上面的注解,则应该先获取该类的Class对象,在通过Class对象解析其上面的注解
  • 比如要解析成员方法上的注解,则应该获取到该成员方法的Method对象,再通过Method对象解析其上面的注解
  • Class、Method、Field、Constructor 都实现了AnnotatedElement接口,都拥有解析注解的能力
    在这里插入图片描述

案例
先定义注解MyTest4

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTest4 {String value();double aaa() default 100;String[] bbb();
}

在Demo类中定义test1方法,在类和方法上使用MyTest4的注解

@MyTest4(value = "蜘蛛精", aaa = 991, bbb = {"Java", "Python"})
public class Demo {@MyTest4(value = "孙悟空", aaa = 22, bbb = {"HTML", "CSS"})public void test1() {}
}

在AnnotationTest3测试类上,解析Demo类中的全部注解

public class AnnotationTest3 {@Testpublic void parseClass() throws NoSuchMethodException {// 1.先得到Class对象Class demoClass = Demo.class;// 2.解析类上的注解// 判断类上是否包含了某个注解if (demoClass.isAnnotationPresent(MyTest4.class)) {MyTest4 myTest4 = (MyTest4) demoClass.getDeclaredAnnotation(MyTest4.class);System.out.println(myTest4.value());System.out.println(myTest4.aaa());System.out.println(Arrays.toString(myTest4.bbb()));}// 3.解析方法上的注解Method test1 = demoClass.getDeclaredMethod("test1");if (test1.isAnnotationPresent(MyTest4.class)) {MyTest4 myTest4 = test1.getDeclaredAnnotation(MyTest4.class);System.out.println(myTest4.value());System.out.println(myTest4.aaa());System.out.println(Arrays.toString(myTest4.bbb()));}}
}

4.注解的应用场景

案例:模拟Junit框架
需求:定义若干个方法,只有加了MyTest注解,就会触发该方法执行
分析:

  1. 定义一个自定义注解MyTest,只能注解方法,存放范围是一直都在
  2. 定义若干个测试方法,部分方法加上@MyTest注解,部分方法不加
  3. 模拟Junit程序,可以触发加了@MyTest注解的方法执行
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTest {
}public class AnnotationTest4 {public void test1() {System.out.println("==test1==");}@MyTestpublic void test2() {System.out.println("==test2==");}public void test3() {System.out.println("==test3==");}@MyTestpublic void test4() {System.out.println("==test4==");}public static void main(String[] args) throws Exception {// 1.获取对象Class annotationTest4Class = AnnotationTest4.class;// 2.获取所有方法Method[] methods = annotationTest4Class.getDeclaredMethods();// 3.遍历所有方法AnnotationTest4 annotationTest4 = new AnnotationTest4();for (Method method : methods) {// 4.判断如果存在MyTest注解if (method.isAnnotationPresent(MyTest.class)) {// 5.存在MyTest注解,执行该方法method.invoke(annotationTest4);}}}
}

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

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

相关文章

拼多多商品详情API接口实时数据,获取到指定商品的详细信息,例如价格、标题、图片、描述、所属类目等信息

1.获取拼多多开发者账号 在使用拼多多 API 之前,需要先注册账号。注册成功后可以获取到相应的key 和Secret 用于调用 API。 2.了解拼多多商品详情 API 拼多多商品详情 API 提供了多种接口可以使用,其中最常用的是 pdd.ddk.goods.detail 接口。此接口可…

CLIP 基础模型:从自然语言监督中学习可转移的视觉模型

一、说明 在本文中,我们将介绍CLIP背后的论文(Contrastive Language-I mage Pre-Training)。我们将提取关键概念并分解它们以使其易于理解。此外,还对图像和数据图表进行了注释以澄清疑问。 图片来源: 论文&#xff1a…

epoll的并发服务器(TCP服务器与客户端通信)

服务器&#xff1a; #include<myhead.h> #define IP "192.168.250.100" #define PORT 8888 /* typedef union epoll_data {void *ptr;int fd;uint32_t u32;uint64_t u64; } epoll_data_t;struct epoll_event {uint32_t events; …

x86架构基础汇编知识

​ 通用寄存器 EAX 32位 函数返回值 AX 低16位 AH 高八位 AL 低八位 EBX 32位 ECX 32位 循环次数&#xff0c;this指针 EDX 32位 EBP 32位 栈底寄存器 ESP 32位 栈顶寄存器 ESI 源索引寄存器 EDI 目标索引寄存器 EIP 无法直接通过汇编操作 例子 mov al&#xff0c;0xff …

Windows虚拟机访问网页证书错误问题

问题&#xff1a; 显示证书错误&#xff0c;图片加载不出来&#xff0c;看着很别扭&#xff0c;如下&#xff1a; 方法: 1.先导出可用的证书&#xff1a; 可以将自己正常环境的证书导出来&#xff08;google浏览器为例&#xff09; 浏览器右上角三个竖点——设置——隐私设…

Python计算机二级知识点整理模拟考试

1. 循环队列是队列的一种顺序存储结构&#xff0c;用队尾指针 rear 指向队列中的队尾元素&#xff0c;用排头指针 front 指向排头元素的前一个位置。因此&#xff0c;从排头指针 front 指向的后一个位置直到队尾指针 rear 指向的位置之间所有的元素均为队列中的元素。 2&…

Python灰帽编程——网页信息爬取

文章目录 网页信息爬取1. 相关模块1.1 requests 模块1.1.1 模块中的请求方法1.1.2 请求方法中的参数1.1.3 响应对象中属性 1.2 RE 模块1.2.1 匹配单个字符1.2.2 匹配一组字符1.2.3 其他元字符1.2.4 核心函数 2. 网页信息爬取2.1 获取网页HTML 源代码2.2 提取图片地址2.3 下载图…

项目开发流程

最近在工作中总是觉得项目开发周期不足,和领导以及同时沟通后,发现自己在评估开发时间的时候,评估不准确,缺少了某些环节的时间评估。例如,没有把需求反串讲,方案讨论和制定以及自测的时间评估在内。所以大致理了一下整个项目的开发周期包含的工作量,这些工作量都需要在给出人力…

多线程的学习第二篇

多线程 线程是为了解决并发编程引入的机制. 线程相比于进程来说,更轻量 ~~ 更轻量的体现: 创建线程比创建进程,开销更小销毁线程比销毁进程,开销更小调度线程比调度进程,开销更小 进程是包含线程的. 同一个进程里的若干线程之间,共享着内存资源和文件描述符表 每个线程被独…

ORB-SLAM2_RGBD_DENSE_MAP编译、问题解决、离线加载TUM数据和在线加载D435i相机数据生成稠密地图

文章目录 0 引言1 安装依赖1.1 其他库安装1.2 pcl库安装 2 编译ORB-SLAM2_RGBD_DENSE_MAP2.1 build.sh2.2 build_ros.sh 3 运行ORB-SLAM2_RGBD_DENSE_MAP3.1 build.sh编译版本3.2 build_ros.sh编译版本 0 引言 ORB-SLAM2_RGBD_DENSE_MAP是基于ORB-SLAM2框架的一种RGB-D稠密地图…

uniapp Echart X轴Y轴文字被遮挡怎么办,或未能铺满整个容器

有时候布局太小&#xff0c;使用echarts&#xff0c;x轴y轴文字容易被遮挡&#xff0c;怎么解决这个问题呢&#xff0c;或者是未能铺满整个容器。 方法1&#xff1a; 直接设置 containLabel 字段 options: { grid: { containLabel: true, },} 方法2: 间接设置&#xff0c;但是…

Kotlin协程CoroutineScope异步async取消cancel等待await的任务

Kotlin协程CoroutineScope异步async取消cancel等待await的任务 import kotlinx.coroutines.*fun main(args: Array<String>) {runBlocking {val mScope CoroutineScope(Dispatchers.IO).async {println("->")delay(999999)println("<-")"…

Jenkins结合Gitlab,实现镜像构建及推送

docker-compose jenkins的docker-compose目录为为/home/jenkins&#xff0c;这个后面写脚本的时候需要对应上 version: 3 services:docker_jenkins:restart: alwaysimage: jenkins/jenkins:ltscontainer_name: docker_jenkinsprivileged: true ports:- 8080:8080- 50000:5000…

【自学开发之旅】Flask-前后端联调-异常标准化返回(六)

注册联调&#xff1a; 前端修改&#xff1a; 1.修改请求向后端的url地址 文件&#xff1a;env.development修改成VITE_API_TARGET_URL http://127.0.0.1:9000/v1 登录&#xff1a;token验证 校验forms/user.py from werkzeug.security import check_password_hash# 登录校验…

Ubuntu下安装Clion

前言 CLion 是一款由 JetBrains 开发的 C 集成开发环境&#xff08;IDE&#xff09;&#xff0c;它拥有许多强大的功能&#xff0c;如代码自动完成、调试器、版本控制等等。CLion本身是收费软件&#xff0c;但如果是学生的话可以申请免费使用。 测试安装环境&#xff1a;Ubunt…

2614. 对角线上的质数-c语言解法

给你一个下标从 0 开始的二维整数数组 nums 。 返回位于 nums 至少一条 对角线 上的最大 质数 。如果任一对角线上均不存在质数&#xff0c;返回 0 。 注意&#xff1a; 如果某个整数大于 1 &#xff0c;且不存在除 1 和自身之外的正整数因子&#xff0c;则认为该整数是一个…

iOS蓝牙 Connection Parameters 关键参数说明

1. 先贴苹果文档 《 Accessory Design Guidelines for Apple Devices 》 2. 几个关键词 connection Event Interval 事件间隔&#xff0c;为1.25ms的倍数。可以简单理解为,是两个连接着的蓝牙设备发送“心跳包”的时间间隔&#xff1b; 范围是 6 ~ 3200&#xff0c;即 7.5…

【ArcGIS】土地利用变化分析详解(栅格篇)

土地利用变化分析详解-栅格篇 土地利用类型分类1 统计不同土地利用类型的面积/占比1.1 操作步骤 2 统计不同区域各类土地利用类型的面积2.1 操作步骤 3 土地利用变化转移矩阵3.1 研究思路3.2 操作步骤 4 分析不同时期土地利用类型及属性变化4.1 研究思路4.2 操作步骤 参考 土地…

建不同锁对象对同表同数据加锁会怎样?

建不同锁对象对同表同数据加锁会怎样&#xff1f; 同事突然问我这个问题&#xff0c;这种东西动手测一下&#xff0c;两分钟的事儿。验证下自己心中所想。 建俩锁对象~ 代码 打断点 执行&#xff1a; 能动手就敲一下&#xff0c;懒得想&#xff0c;懒得记~ 推荐阅读&#xff1a…

ETLCloud助力富勒TMS实现物流数仓同步

富勒TMS提供了多种运输管理业务的解决方案&#xff0c;极大的方便了企业对物流的管理和人力输出&#xff0c;同时提供了大量的API接口&#xff0c;供用户做数据集成和数仓同步。 通过富勒TMS中心&#xff0c;第三方开发者和商家可实现以下功能&#xff1a; MS系统数据同步&…