注解(Annotation) --java学习笔记

注解

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

自定义注解

就是自己定义注解

自定义注解到底该怎么写:

public @interface MyTest1 {String aaa();boolean bbb() default true;String[] ccc();
}

自定义注解写了属性,在使用注解时,除非该属性设置了默认值,不然一定要给属性赋值

特殊属性名:value

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

注解可以用在类、方法、变量等:

package com.zeyu.annotation;
@MyTest1(aaa="zeYu",ccc={"aaa","bbb","ccc"})
//@MyTest2(value="zeYu")
@MyTest2("zeYu")    //注解中只有一个value属性,使用注解时,value名称可以不写
public class annotationTest1 {@MyTest1(aaa="zeYu",bbb=false,ccc={"ddd","eee"})public void test1(){}
}

注解的原理

  • 注解本质是一个接口,Java中所有注解都是继承了Annotation接口的
  • @注解(...):其实就是一个实现类对象,实现了该注解以及Annotation接口

元注解

  • 指的是:修饰注解的注解

例如:

常用元注解:

代码演示:

package com.zeyu.annotation;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.TYPE表示该注解只可以用在类和方法上
@Retention(RetentionPolicy.RUNTIME) //控制下面的注解一直保留到运行时
public @interface MyTest3 {}

测试:

package com.zeyu.annotation;
@MyTest3    //用在类上没问题
public class annotationTest2 {
//    @MyTest3    //用在成员变量不行public String name;@MyTest3    //用在方法上没问题public void test(){}
}

什么是注解的解析?

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

如何解析注解?

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

解析注解的案例

具体需求如下:

  1. 定义注解MyTest4,要求如下
    包含属性:String value()
    包含属性:double aaa(),默认值为 100
    包含属性:Stringll bbb()
    限制注解使用的位置:类和成员方法上
    指定注解的有效范围:一直到运行时
  2. 定义一个类叫:Demo,在类中定义一个test1方法,并在该类和其方法上使用MyTest4注解
  3. 定义AnnotationTest3测试类,解析Demo类中的全部注解

代码:

MyTest4:
package com.zeyu.annotation;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTest4 {String value();double aaa() default 100;String[] bbb();
}
Demo:
package com.zeyu.annotation;
@MyTest4(value="zeYu",bbb={"aaa","bbb"})
public class Demo {@MyTest4(value="zeYu",bbb={"ccc","ddd"})public void test1(){}
}
annotationTest3:
package com.zeyu.annotation;import org.junit.Test;import java.lang.reflect.Method;
import java.util.Arrays;public class annotationTest3 {@Testpublic void parseClass(){//先得到Class对象Class c = Demo.class;//判断类上是否包含了某个注解if(c.isAnnotationPresent(MyTest4.class)){MyTest4 myTest4 = (MyTest4) c.getDeclaredAnnotation(MyTest4.class);System.out.println(myTest4.value());System.out.println(myTest4.aaa());System.out.println(Arrays.toString(myTest4.bbb()));}}@Testpublic void parseMethod() throws Exception {//先得到Class对象Class c = Demo.class;Method test1 = c.getDeclaredMethod("test1");//判断类上是否包含了某个注解if(test1.isAnnotationPresent(MyTest4.class)){MyTest4 myTest4 = (MyTest4) test1.getDeclaredAnnotation(MyTest4.class);System.out.println(myTest4.value());System.out.println(myTest4.aaa());System.out.println(Arrays.toString(myTest4.bbb()));}}
}

测试结果:

案例:模拟Junit框架

需求

  • 定义若干个方法,只要加了MyTest注解,就会触发该方法执行

分析

  1. 定义一个自定义注解MyTest,只能注解方法,存活范围是一直都在
  2. 定义若干个方法,部分方法加上@MyTest注解修饰,部分方法不加
  3. 模拟一个junit程序,可以触发加了@MyTest注解的方法执行

代码:

MyTest:
package com.zeyu.annotation;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target(ElementType.METHOD) //只能用在方法上
@Retention(RetentionPolicy.RUNTIME) //一直到运行时都存在
public @interface MyTest {
}

测试类:

package com.zeyu.annotation;import java.lang.reflect.Method;public class annotationTest4 {//@MyTestpublic void test1(){System.out.println("-----------test1-----------");}@MyTestpublic void test2(){System.out.println("-----------test2-----------");}//@MyTestpublic void test3(){System.out.println("-----------test3-----------");}@MyTestpublic void test4(){System.out.println("-----------test4-----------");}public static void main(String[] args) throws Exception {//1、得到Class对象Class c = annotationTest4.class;annotationTest4 a = new annotationTest4();//2、提取这个类中的全部成员方法Method[] methods = c.getDeclaredMethods();//3、遍历这个数组中的每个方法,看方法上是否存在@MyTest注解,存在则执行该方法for (Method method : methods) {if (method.isAnnotationPresent(MyTest.class)) {//说明存在该注解,执行该方法method.invoke(a);}}}
}

运行结果:

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

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

相关文章

linux离线安装redis

一、下载linux版本压缩包 地址:Download | Redis 为了安全稳定性,下载 6.2 版本,不下载最新版 二、上传到linux服务器 笔者上传到 /opt/redis下 ,使用Xftp和Xshell工具,使用root权限 cd /opt sudo mkdir redis cd r…

Dude, where’s that IP? Circumventing measurement-based IP geolocation(2010年)

下载地址:https://www.usenix.org/legacy/event/sec10/tech/full_papers/Gill.pdf 被引次数:102 Gill P, Ganjali Y, Wong B. Dude, Wheres That {IP}? Circumventing Measurement-based {IP} Geolocation[C]//19th USENIX Security Symposium (USENIX Security 10). 2010.…

SQLite 4.9的虚拟表机制(十四)

返回:SQLite—系列文章目录 上一篇:SQLite 4.9的 OS 接口或“VFS”(十三) 下一篇:SQLite数据库文件格式(十五) 1. 引言 虚拟表是向打开的 SQLite 数据库连接注册的对象。从SQL语句的角度来看, 虚拟表…

MySQL 主从 AUTO_INCREMENT 不一致问题分析

作者:vivo 互联网数据库团队 - Wei Haodong 本文介绍了 MySQL5.7 中常见的replace into 操作造成的主从auto_increment不一致现象,一旦触发了主从切换,业务的正常插入操作会触发主键冲突的报错提示。 一、问题描述 1.1 问题现象 在 MySQL …

网络——初识网络

在现如今,网络已经成了一种基础设施,大到国家,小到个人,网络已经充斥在我们每个人的身 边,如果一个人突然失去了网络,那么它的生活或多或少会出现一些不方便的地方,网络现在已 经伴随着我们的吃…

python镜像安装(ios、windows)

如果你在使用Python时发现官方网站下载速度过慢,可以考虑使用国内的Python镜像源下载Python。国内的Python镜像源可以提供更快的下载速度和更好的下载体验。 以下是使用国内Python镜像源下载Python的步骤: 步骤 1:选择Python版本 首先&…

C++11 设计模式1. 模板方法(Template Method)模式学习。UML图

一 什么是 "模板方法(Template Method)模式" 在固定步骤确定的情况下,通过多态机制在多个子类中对每个步骤的细节进行差异化实现,这就是模板方法模式能够达到的效果。 模板方法模式属于:行为型模式。 二 &…

PostgreSQL入门到实战-第十四弹

PostgreSQL入门到实战 PostgreSQL数据过滤(七)官网地址PostgreSQL概述PostgreSQL中BETWEEN 命令理论PostgreSQL中BETWEEN 命令实战更新计划 PostgreSQL数据过滤(七) BETWEEN运算符允许您检查值是否在值的范围内。 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容…

坚持十天做完Python入门编程100题第三天加班

坚持十天做完Python入门编程100题第三天加班 第24题 扫描文件列表第25题 如何将字典转换成JSON并写入json文件?第26题 JSON转换成字典 第24题 扫描文件列表 如何扫描当前目录下的文件列表?解析:可以使用python内置的glob模块,用法…

Python | Leetcode Python题解之第22题括号生成

题目: 题解: class Solution:def generateParenthesis(self, n: int) -> List[str]:if n 0:return []total_l []total_l.append([None]) # 0组括号时记为Nonetotal_l.append(["()"]) # 1组括号只有一种情况for i in range(2,n1): …

区块链:开启信任的新时代

区块链是一种基于去中心化、分布式的数据存储、传输、记录和验证的数据库技术。它通过一串使用密码学算法链接起来的区块,形成了一个公开透明、不可篡改的数据记录系统。 区块链技术的核心特点就是去中心化。在传统的中心化系统中,数据存储和记录往往由…

商家转账到零钱功能如何操作开通

商家转账到零钱是什么? 商家转账到零钱是微信商户号里的一个功能,以前叫做企业付款到零钱。从 2022 年 5 月 18 日开始,原企业付款到零钱升级为商家转账到零钱,已开通商户的功能使用不受影响,新开通商户可前往产品中心…

langchain + azure chatgpt组合配置并运行

首先默认你已经有了azure的账号。 最重要的是选择gpt-35-turbo-instruct模型、api_version:2023-05-15,就这两个参数谷歌我尝试了很久才成功。 我们打开https://portal.azure.com/#home,点击更多服务: 我们点击Azure OpenAI&#…

竞品数据的监测范围

常规的数据监测一般指的是价格监测,品牌对线上产品链接中的页面价、到手价进行监测,同时也可监测标题变化、销量变化、库存变化、优惠信息变化等,对于对够执行数据监测的系统来说,不管哪个品牌的数据都可做到以上维度的监测&#…

【算法基础】选择排序与冒泡排序的思想与实现

文章目录 1. 选择排序1.1 思想1.2 实现 2. 冒泡排序2.1 思想2.2 实现 1. 选择排序 1.1 思想 选择排序的思想很简单,如上图所示。在每一次遍历子数组的过程中,选择最小的和子数组的第一位交换。子数组的选择从一开始的整个数组,到后面范围逐渐…

全局锁和表锁 :给表加个字段怎么有这么多阻碍?

全局锁和表锁 :给表加个字段怎么有这么多阻碍? 今天我要跟你聊聊 MySQL 的锁。数据库锁设计的初衷是处理并发问题。作为多用户共享的资源,当出现并发访问的时候,数据库需要合理地控制资源的访问规则。而锁就是用来实现这些访问规则…

互联网大厂ssp面经之路:计算机网络part1

1. 计算机网络的组成部分有哪些? a. 硬件设备:计算机网络由各种硬件设备组成,包括计算机、服务器、路由器、交换机、网卡等。这些设备通过物理连接(如网线、光纤)相互连接。 b. 协议:计算机网络中的通信需…

ROS2 采集虚拟仿真环境图像并发布

简介:ROS2功能的学习我们还是在基于OpenAI的gym虚拟仿真环境中来完成,gym虚拟仿真环境安装请参考另一篇教程,这里不再重复说明,接下来我们开始创建一个ROS2的功能节点,并发布虚拟仿真环境小车摄像头的图像,…

图像分割-RSPrompter

文章目录 前言1. 自动化提示器1.1 多尺度特征增强器1.2 RSPrompterAnchor-based PrompterQuery-based Prompter 2. SAM的扩展3. 结果WHU数据集NWPU数据集SSDD数据集 前言 《RSPrompter: Learning to prompt for remote sensing instance segmentation based on visual foundati…

即插即用篇 | YOLOv5/v7引入Haar小波下采样 | 一种简单而有效的语义分割下采样模块

本改进已集成到 YOLOv5-Magic 框架。 下采样操作如最大池化或步幅卷积在卷积神经网络(CNNs)中被广泛应用,用于聚合局部特征、扩大感受野并减少计算负担。然而,对于语义分割任务,对局部邻域的特征进行池化可能导致重要的空间信息丢失,这有助于逐像素预测。为了解决这个问题…