当前位置: 首页 > news >正文

Java 实现自定义注解

一、@interface 关键字

我们想定义一个自己的注解 需要使用 @interface 关键字来定义。
如定义一个叫 MyAnnotation 的注解:

public @interface MyAnnotation { }

 二、元注解

  光加上 @interface 关键字 还不够,我们还需要了解5大元注解

  • @Retention
  • @Target
  • @Documented
  • @Inherited(JDK8 引入)
  • @Repeatable(JDK8 引入)

 1)  @Retention 指定注解的生命周期    

@Retention(RetentionPolicy.SOURCE)

其中Retention是一个枚举类:

  1. RetentionPolicy.SOURCE : 注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃(.java文件)
  2. RetentionPolicy.CLASS :注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期(.class文件)
  3. RetentionPolicy.RUNTIME: 注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在(内存中的字节码)

2) @Target指定注解可以修饰的元素类型

@Target(ElementType.Field)
  1. ElementType.ANNOTATION_TYPE - 标记的注解可以应用于注解类型。
  2. ElementType.CONSTRUCTOR - 标记的注解可以应用于构造函数。
  3. ElementType.FIELD - 标记的注解可以应用于字段或属性。
  4. ElementType.LOCAL_VARIABLE - 标记的注解可以应用于局部变量。
  5. ElementType.METHOD - 标记的注解可以应用于方法。
  6. ElementType.PACKAGE - 标记的注解可以应用于包声明。
  7. ElementType.PARAMETER - 标记的注解可以应用于方法的参数。
  8. ElementType.TYPE - 标记的注解可以应用于类的任何元素。

 3)@Documented
指定注解会被JavaDoc工具提取成文档。默认情况下,JavaDoc是不包括文档的

 4)@Inherited
表示该注解会被子类继承,注意,仅针对类,成员属性、方法并不受此注释的影响。

 5)@Repeatable
表示注解可以重复使用,为了解决同一个注解不能重复在同一类/方法/属性上使用的问题。

        其中最常用的就是 @Retention 跟 @Target。

三、简单实现

        例如实现一个简单,在标记注解的地方打印一句日志。
        定义一个 MyAnnotation 注解,并且定义一个属性 message 默认值是 ”aaa“。先将该注解加到字段上,看能不能获取到。

//注解用于字段上
@Target(ElementType.FIELD)
//运行时使用
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {String message() default  "aaa";}

        定义一个Student类用于测试: 

@Data
public class Student {@JSONField(ordinal =0)@MyAnnotation(message = "AAAAAAAAA")public String name;@MyAnnotation(message = "AAAAAAAAA")public Integer score;}

  在字段上标注该注解,然后编写一个main方法获取该注解的属性:

    public static void main(String[] args) {Class<?> studentClass = Student.class;Field[] fields = studentClass.getDeclaredFields();//获取所有的类成员变量字段for (Field field : fields) {String fieldName = field.getName(); //获取该类成员变量的名字System.out.println("成员变量名是:" + fieldName);Annotation[] annotations = field.getAnnotations(); //获取该类成员变量上所有声明周期是运行时的注解for (Annotation annotation : annotations) {Class<? extends Annotation> annotationType = annotation.annotationType();String annotationName = annotationType.getSimpleName();//注解的简短名称System.out.println(" 使用的注解是:" + annotationName);//判断该注解是不是 MyAnnotation 注解,是的话打印其 id 和 describe 属性if (annotationType.equals(MyAnnotation.class)) {MyAnnotation myAnnotation = field.getAnnotation(MyAnnotation.class);String message = myAnnotation.message();System.out.println("    MyAnnotation注解中的message是:" + message);}}System.out.println();}}

 执行后打印的内容:

        以上就是一个注解的简单实现。

四、使用切面执行自定义注解逻辑

        在开发中一般加上注解之后会自动执行一些逻辑,大部分实现的原理是使用切面来实现注解的逻辑的。

       1) 首先将刚才的注解修改成放在方法上的:

//注解用于方法
@Target(ElementType.METHOD)
//运行时使用
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {String message() default  "aaa";}

        2) 定义一个切面类:

@Component
@Aspect
@Slf4j
public class MyAnnotationAspect {/** 这是一个切入点* */@Pointcut("@annotation(com.redis.demo.aaa.annotation.MyAnnotation)")public void cutMethod(){}@Around("cutMethod() && @annotation(myAnnotation)")public Object around(ProceedingJoinPoint point, MyAnnotation myAnnotation) {//获取方法名称Signature methodName = point.getSignature();//日志输出log.info(methodName+"进来了");Long l1=System.currentTimeMillis();Object obj=null;try {obj= point.proceed(point.getArgs());} catch (Throwable e) {e.printStackTrace();}log.info(methodName+"bye"+"\t耗時 "+(System.currentTimeMillis()-l1)+"\t"+myAnnotation.message());//记录一个耗时时间,将证明日志通知return obj;}}

        

相关文章:

Java 实现自定义注解

一、interface 关键字 我们想定义一个自己的注解 需要使用 interface 关键字来定义。 如定义一个叫 MyAnnotation 的注解&#xff1a; public interface MyAnnotation { } 二、元注解 光加上 interface 关键字 还不够&#xff0c;我们还需要了解5大元注解 RetentionTargetDo…...

代码随想录Day48

Day 48 动态规划part09 今日任务 198.打家劫舍213.打家劫舍II337.打家劫舍III 代码实现 基础打家劫舍 class Solution {public static int rob(int[] nums) {if (nums null || nums.length 0) return 0;if (nums.length 1) return nums[0];int[] dp new int[nums.leng…...

Web 后台项目,权限如何定义、设置、使用:菜单权限、按钮权限 ts element-ui-Plus

Web 后台项目&#xff0c;权限如何定义、设置、使用&#xff1a;菜单权限、按钮权限 ts element-ui-Plus 做一个后台管理项目&#xff0c;里面需要用到权限管理。这里说一下权限定义的大概&#xff0c;代码不多&#xff0c;主要讲原理和如何实现它。 一、权限管理的原理 权限…...

ADB 操作命令及其详细用法

adb devices 用途&#xff1a;列出连接到计算机的所有 Android 设备。详解&#xff1a;执行该命令后&#xff0c;ADB 将扫描连接到计算机的所有 Android 设备&#xff0c;并列出它们的序列号。 adb connect <device> 用途&#xff1a;连接到指定 IP 地址的 Android 设备。…...

类的函数成员(三):拷贝构造函数

一.什么是拷贝构造函数&#xff1f; 1.1 概念 同一个类的对象在内存中有完全相同的结构&#xff0c;如果作为一个整体进行复制或称拷贝是完全可行的。这个拷贝过程只需要拷贝数据成员&#xff0c;而函数成员是共用的&#xff08;只有一份拷贝&#xff09;。 在建立对象…...

C#操作MySQL从入门到精通(8)——对查询数据进行高级过滤

前言 我们在查询数据库中数据的时候,有时候需要剔除一些我们不想要的数据,这时候就需要对数据进行过滤,比如学生信息中,我只需要年龄等于18的,同时又要家乡地址是安徽的,类似这种操作专栏第7篇的C#操作MySQL从入门到精通(7)——对查询数据进行简单过滤简单过滤方法就无法…...

Centos 7 安装通过yum安装google浏览器

在CentOS 7上使用yum安装Google Chrome浏览器稍微复杂一些&#xff0c;因为Chrome并不直接包含在默认的Yum仓库中。按照以下步骤来操作&#xff1a; 1、添加Google Chrome仓库 首先&#xff0c;您需要手动添加Google Chrome的Yum仓库。打开终端&#xff0c;并使用文本编辑器&a…...

题目:学习使用按位与 。

题目&#xff1a;学习使用按位与 & 。   There is no nutrition in the blog content. After reading it, you will not only suffer from malnutrition, but also impotence. The blog content is all parallel goods. Those who are worried about being cheated shoul…...

逐步分解,一文教会你如何用 jenkins+docker 实现主从模式

jenkins 主从模式想必大家都不陌生&#xff0c;大家在学习过程中为了学习方便都在自己本地搭建了 jenkins 环境&#xff0c;然后通过 javaweb 方式实现&#xff0c;对于 docker 下实现主从模式大家好像兴趣挺大。 今天就通过这篇文章给大家讲讲怎么玩&#xff0c;希望对大家有…...

WebSocket 对于手游的意义

WebSocket作为一个HTTP的升级协议&#xff0c;其实对HTTP协议用的不多&#xff0c;主要是消息头相关部分&#xff0c;WebScoket协议最初的动机应该是给网页应用增加一个更贴近实时环境的通讯方式&#xff0c;让某些网页应用得到更佳的通讯质量&#xff08;双工&#xff0c;低延…...

安卓APP的技术质量:如何提高

安卓APP的技术质量:如何提高 技术质量包括稳定性和性能,还有资源工具化程序.你的APP 的技术质量能够影响你的用户体验.一个高质量的体验不仅 最小化了技术问题的存在,而且也最大化地利用了安卓操作 系统和设备硬件的能力. 为了构建一个高质量的APP,遵循如下的指导原则: 形式因…...

二分查找 -- 力扣(LeetCode)第704题

题目 https://leetcode.cn/problems/binary-search/description/ 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。 示例…...

Windows下如何确定虚函数在虚函数表中的位置

我需要用c#调用 c 的 类的函数, 虽然可以通过头文件的顺序&#xff0c;但是如果可以打印出虚函数在虚表中的Offset更好。 测试要求: Windows, x86 只有1层虚函数&#xff0c;没有被override过 虚函数调用如下 auto a_reqCreditDetail &XtTraderApi::reqCreditDetail; (a…...

C++设计模式:观察者模式(三)

1、定义与动机 观察者模式定义&#xff1a;定义对象间的一种1对多&#xff08;变化&#xff09;的依赖关系&#xff0c;以便当一个对象&#xff08;Subject&#xff09;的状态发生比改变时&#xff0c;所有依赖于它的对象都得到通知并且自动更新 再软件构建过程中&#xff0c…...

CentOS运行Py脚本报错illegal instruction故障处理

测试Python脚本运行环境及依赖 [root@localhost network]# python3 devops_ping_test1.py Illegal instruction ①、illegal instruction报错 由于本人第一次测试时运行是正常的,但是在测试过程中多次修改、覆盖代码运行后提示Illegal instruction(非法指令),所以不能单…...

软件设计师——1.备考提纲

知识点说明比例软件工程基础知识11开发模型、设计原则、测试方法、质量特性、CMM、Pert图、风险管理14.67%面向对象12面向对象基本概念、面向对象分析与设计、UML、设计模式16.00%数据结构与算法10数组、栈、队列、树与二叉树、图、查找与排序、常见算法13.33%程序设计语言6文法…...

[开源] 基于GRU的时间序列预测模型python代码

基于GRU的时间序列预测模型python代码分享给大家&#xff0c;记得点赞哦 #!/usr/bin/env python # coding: utf-8import time time_start time.time() import numpy as np import matplotlib.pyplot as plt import pandas as pd import math from keras.models import Sequent…...

SQL SERVER 备份

目录 1.备份概念 1.1 为何备份? 1.2 SQL Server 备份模式 2.SQL Server 数据库备份 2.1 借助SSMS备份数据库 2.2 借助 T-SQL 备份数据库 2.3 创建加密备份 2.4 备份文件和文件组 权限 步骤 2.5 备份事务日志 3.维护计划 3.1 完整备份 3.2 差异备份...

提示词专场:从调整提示改善与LLMs的沟通,到利用LLMs优化提示效果

编者按&#xff1a;欢迎阅读“科研上新”栏目&#xff01;“科研上新”汇聚了微软亚洲研究院最新的创新成果与科研动态。在这里&#xff0c;你可以快速浏览研究院的亮点资讯&#xff0c;保持对前沿领域的敏锐嗅觉&#xff0c;同时也能找到先进实用的开源工具。 提示词的好坏决…...

测开面经(pytest测试案例,接口断言,多并发断言)

pytest对用户登录接口进行自动化脚本设计 a. 创建一个名为"test_login.py"的测试文件&#xff0c;编写以下测试脚本 import pytest import requests# 测试用例1&#xff1a;验证登录成功的情况 # 第一个测试用例验证登录成功的情况&#xff0c;发送有效的用户名和密…...

5个实用技巧:用CaptfEncoder快速搞定网络安全编码任务

5个实用技巧&#xff1a;用CaptfEncoder快速搞定网络安全编码任务 【免费下载链接】CaptfEncoder Captfencoder is opensource a rapid cross platform network security tool suite, providing network security related code conversion, classical cryptography, cryptograp…...

快速 AI 迭代仍然需要操作纪律

前言 配套资源&#xff1a;AI 辅助开发检查清单资源包&#xff0c;适合把本文的流程直接落成开发前检查表和复盘模板。 上一篇文章里&#xff0c;我把 AI 工作流拆成了几类任务模式&#xff1a;开发维护、探索学习、反馈确认。这个分类解决的是一个前置问题&#xff1a;在使用 …...

移动端部署实战:用PyTorch实现的MobileNetV2模型,教你如何压缩并部署到安卓设备

移动端AI模型部署实战&#xff1a;从PyTorch到安卓的MobileNetV2全流程指南 在移动设备上部署深度学习模型已成为AI落地的关键环节。想象一下&#xff0c;当你用手机拍照时实时识别人物和场景&#xff0c;或是通过智能家居摄像头检测异常行为——这些场景背后都离不开高效、轻量…...

AzurLaneLive2DExtract:碧蓝航线Live2D资源提取的完整指南

AzurLaneLive2DExtract&#xff1a;碧蓝航线Live2D资源提取的完整指南 【免费下载链接】AzurLaneLive2DExtract OBSOLETE - see readme / 碧蓝航线Live2D提取 项目地址: https://gitcode.com/gh_mirrors/az/AzurLaneLive2DExtract 想要从碧蓝航线游戏中提取精美的Live2D…...

用YOLOv8和MMSegmentation实战:从血细胞检测到癌细胞分割(附完整代码)

医学影像实战&#xff1a;基于YOLOv8与MMSegmentation的细胞检测与分割全流程 在医疗影像分析领域&#xff0c;深度学习技术正逐步改变传统人工判读的低效模式。本文将带您完成两个典型医学影像任务的完整实现&#xff1a;使用YOLOv8进行血细胞检测分类&#xff0c;以及通过MMS…...

终极免费macOS应用清理工具:让你的Mac告别数字垃圾

终极免费macOS应用清理工具&#xff1a;让你的Mac告别数字垃圾 【免费下载链接】Pearcleaner A free, source-available and fair-code licensed mac app cleaner 项目地址: https://gitcode.com/gh_mirrors/pe/Pearcleaner 你是否曾经遇到过这样的困扰&#xff1a;明明…...

【免费下载】 轻松连接Hive数据库:Hive JDBC驱动包下载指南

轻松连接Hive数据库&#xff1a;Hive JDBC驱动包下载指南 【下载地址】HiveJDBC驱动包下载 该资源文件是一个压缩包&#xff0c;使用zip格式进行压缩&#xff0c;方便用户直接解压并获取Hive JDBC驱动。解压后即可使用其中的hive-jdbc-uber-2.6.5.0-292.jar文件 项目地址: ht…...

NotebookLM具身智能落地实战(从零部署到ROS2集成):谷歌AI团队内部培训手册泄露版

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;NotebookLM具身智能研究 NotebookLM 是 Google 推出的基于用户自有文档进行语义理解与推理的 AI 助手&#xff0c;其核心能力在于“文档感知”&#xff08;document-grounded reasoning&#xff09;。当…...

Warcraft Helper完整指南:让经典魔兽争霸3在现代Windows系统焕发新生

Warcraft Helper完整指南&#xff1a;让经典魔兽争霸3在现代Windows系统焕发新生 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽争霸3在Wi…...

可穿戴魔法独角兽帽:从PWM控制到软硬件集成的嵌入式实践

1. 项目概述&#xff1a;一个会动的魔法独角兽帽子几年前&#xff0c;我第一次在创客展上看到有人把微控制器和伺服电机缝进衣服里&#xff0c;让一件普通的卫衣“活”了起来&#xff0c;当时就觉得这太酷了。这种将冰冷的电子元件与温暖的织物结合&#xff0c;创造出有生命感的…...