java中如何自定义注解

Java 自定义注解 Java自定义注解Java注解简介Java元注解自定义注解代码演示 本章点知识总览: 1、Java 注解简介 2、Java 元注解(重点) 3、自定义注解 4、Aop 自定义注解的应用(重点) Java注解(Annotation) 分类 编程技术 Java注解(Annotation)又称Java标注,是JDK5.0约会的一种注释机制。 和Javadoc不同,Java标注可以通过反射获取标注内容。 ... 阅读详情

作为一名开发人员,注解的的使用是最常见的了,比如Spring框架里的业务层注解@Service、@Transaction,控制层用的@Controller、@Autowired,SpringBoot框架的启动类注解@SpringBootApplication等等。那么如何自定义注解呢?

一、什么是注解

注解(Annotation)是元数据的一种形式,从JDK5.0 引入,它能为代码提供一些相关数据,以便于在代码编译或运行时使用。

二、注解的作用

Java中的注解可以修饰类、方法、变量、参数等。注解可以通过反射手段获取其内容,在编译器生成类文件时,注解可以被嵌入到字节码中。当然JVM也可以保留注解的内容,在运行时动态,总结起来主要是以下几个层面:

  • 编译器根据注解在编译代码时行进行提示警告或错误信息
    例如我们在使用java.util包下的Date类时,调用了类中被@Deprecated标注的方法,IDE会在编译时会有警告信息
public static void main(String[] args) {
    Date date = new Date();
    //JDK源码中,Date类的getDay方法被@Deprecated注解标注,代表方法已过时
    int day = date.getDay();
}
  • 编译运行时时根据注解动态生成代码
    例如在springboot框架中,我们实现一个Controller层方法的前置通知,通过使用@Aspect、@Before等注解即可,当然这些注解是框架封装好的,屏蔽了底层的细节,但是AOP的原理,大家应该都很熟悉
@Slf4j
@Component
@Aspect
public class MyAspect {
     
    @Before(value = "execution(public * com.test.controller.*.*(..))")
    public void before(JoinPoint joinPoint) {
        log.info("CLASS_METHOD:[{}]" , joinPoint.getSignature().getName());
    }
}
  • 程序运行时使用注解进行动态赋值
    比如通过使用@Value注解,将配置文件参数赋给代码里面变量,例如SpringBoot里面集成RabbitMq时,账户密码等配置信息通过注解进行配置
@Configuration
public class RabbitMqConfig {

    @Value("${spring.rabbitmq.host}")
    private String rabbitMqHost;

    @Value("${spring.rabbitmq.port}")
    private String rabbitMqPort;
}

三、自定义注解

首先我们先看下一个注解示例,下面是javafx.beans包下的@DefaultProperty注解 :

package javafx.beans;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * Specifies a property to which child elements will be added or set when an
 * explicit property is not given.
 *
 * @since JavaFX 2.0
 */
@Inherited
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface DefaultProperty {
    /**
     * The name of the default property.
     */
    public String value();
}

我们看到定义注解与定义一个class类相似,不过其中class关键字被替换为了@interface,注解里声明了一个String类型的value属性,注意这种声明属性方式!稍后会详细说明。同时还可以看到DefaultProperty注解被@Inherited、@Documented、@Retention(RetentionPolicy.RUNTIME)、@Target(ElementType.TYPE)这些注解所修饰,这就是我们需要知道另外一个概念——元注解(meta-annotations)。

1.元注解

元注解是我们在定义注解时需要用到的一些特殊含义的注解,可以说它们是对声明注解时的注解。java语言为我们默认提供了以下元注解,在java.lang.annotation包下,我们来看下:

  • @Retention(RetentionPolicy.XX) 注解的保留域,表示注解的保留范围,可选项有

    • RetentionPolicy.SOURCE – 源代码级别保留,编译器编译后该类型的注解就被丢弃掉了,生成的.class字节码文件中,将不再存在该类型的注解.
    • RetentionPolicy.CLASS – .class字节码文件中保留,编译器编译后保留,JVM加载后丢弃掉,运行时无法获取
    • RetentionPolicy.RUNTIME – 运行时保留,在运行时,JVM使用反射,可以获取注解属性内容,绝大多数注解在定义是使用都是该级别
  • @Target( ElementType.XX) 指定该注解可以使用的地方,如类声明、方法声明,变量声明等等, 在定义注解时,如果没有使用Target指定,默认都可以使用。如果使用了Target指定使用的位置,那么该注解只能在所指定的位置使用

    • ElementType.ANNOTATION_TYPE 注解类型声明
    • ElementType.CONSTRUCTOR 构造方法
    • ElementType.FIELD 字段声明(包括枚举常量)
    • ElementType.LOCAL_VARIABLE 局部变量声明
    • ElementType.METHOD 方法声明
    • ElementType.PACKAGE 包声明
    • ElementType.PARAMETER 方法的参数声明
    • ElementType.TYPE 类、接口(包括注解类型)或enum声明
  • @Documented 表示在使用Javadoc工具生成文档时,包含此注解信息

  • @Inherited 表示当前注解是可继承的,父类中所使用的注解如果被@Inherited修饰,子类会继承父类中对应的注解

2.注解属性

明白了注解的外在定义形式,那么我们就来看下注解内部的属性的定义方式,Talk is cheap. Show me the code多说无益,直接上代码

@Documented
@Inherited
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    /**
     *1、属性的定义和接口中方法声明类似,访问修饰符默认是public,可省略,注意属性名后面跟了()
     */
    String name();
    
    /**
     * 2、可以通过default为属性指定默认值,在注解使用时,可以为之赋值, 也可以不赋值
     *  当然如果不通过default为属性指定默认值,在注解使用必须使用该属性并且为之赋值
     */
    int age() default 1;
    
    /**
     * 3、注解中的属性value比较特殊,如果使用注解时仅为该属性赋值,"value="可以省略掉,
     * 但是如果和其他属性同时赋值,“value=”则不能省略,这个特性和value的属性类型无关
     */
    String value() default "";
   
    /**
     * 4.注解中属性的类型可以是基本数据类型及其数组、类、枚举、注解
     */
    boolean sex() default true;
    
}

四、通过反射获取注解属性值

在上面代码中,我们自定义了@MyAnnotation注解,并且指明@Target({ElementType.METHOD})表明此注解只能用在方法声明上, @Retention(RetentionPolicy.RUNTIME)指定其保留到代码运行时,所以我们可以通过反射获取MyAnnotation的属性值。
下面我们定义了一个Person类,并在其中定义了一个sayHello方法,在方法声明上,我们使用@MyAnnotation注解,我们将使用反射调用sayHello方法,并且使用MyAnnotation注解中的属性值

package com.test.annotation;
import com.test.enu.Color;
import java.lang.annotation.Annotation;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Person {

    @MyAnnotation(name="韩梅梅",age = 30,sex = true,clothes = Color.YELLOW)
    public  void sayHello(String name){
        System.out.println("Hello!" + name);
    }

    public static void main(String[] args) throws InvocationTargetException, IllegalAccessException {
        Person person = new Person();
        //获取Person类的Class对象
        Class<? extends Person> personClass = person.getClass();
        //获取类中声明的方法列表
        Method[] declaredMethods = personClass.getDeclaredMethods();
        for (Method method : declaredMethods) {
            //判断当前方法是否含有MyAnnotation注解
            if(method.isAnnotationPresent(MyAnnotation.class)){
                //获取MyAnnotation类型注解
                MyAnnotation myAnnotation = method.getAnnotation(MyAnnotation.class);
                //反射调用方法,并传递注解name属性值为参数
                Object invoke = method.invoke(person,myAnnotation.name());
                //打印注解中定义的各个类型的值
                System.out.println(myAnnotation);
                System.out.println(myAnnotation.name()+","+myAnnotation.sex()+","+myAnnotation.age());
            }
        }
    }
}

此时的IDE控制台输出,说明我们通过反射在运行时获取到了@MyAnnotation注解的值

Hello!韩梅梅
韩梅梅,true,30
@com.test.annotation.MyAnnotation(value=, age=30, sex=true, name=韩梅梅, clothes=YELLOW)

五、JDK内部自带注解

JDK自带了一些原先定义好的注解,我们可以直接使用

  • @Override 表示当前方法覆盖了父类的方法
  • @Deprecation 表示方法已经过时,方法上有横线,使用时会有警告。
  • @SuppviseWarnings 表示关闭一些警告信息(通知java编译器忽略特定的编译警告)

至于注解内部详细内容,大家可以点进去源码查看。希望本篇文章对你有所帮助!

微信小程序marker 上的自定义气泡cover-view字体丢失以及max-width不生效问题 阅读详情

相关推荐

Allegro File菜单实战指南:从导入网表到导出BOM的完整流程

PCB设计离不开对EDA软件菜单体系的深入理解。在Cadence Allegro中,File菜单是数据流转的中枢,它不仅是新建、打开、保存的基础入口,更是连接原理图与版图、设计与制造的关键桥梁。工程师常遇到的“导入网表报错”“导出BOM为空”“板框不闭合”等高频问题,大多源于对File菜单中Import与Export功能的理解不到位。从基础概念出发,先厘清Import(网表、DXF、IPC)与Export(BOM、ODB++、DXF)的工作原理,再结合版本兼容、封装库路径、单位设置等工程细节,即可构建完整的

weixin_32950759的博客 295

【Java基础】注解——自定义注解

public @interface 注解名{}看起来和定义接口很相似只是多了一个@符号 接口:public interface 接口名注解:public @interface 注解名。

橙子的博客 5828

5分钟搞定PaddleOCR PP-OCRv5环境搭建:从安装到第一个识别Demo

本文提供了一份详细的PaddleOCR PP-OCRv5环境搭建与快速入门指南。通过清晰的步骤,指导读者在5分钟内完成从创建Python虚拟环境、安装PaddlePaddle框架和PaddleOCR库,到编写并运行第一个OCR识别Demo的全过程,帮助开发者快速体验最新的PP-OCRv5模型的文字识别能力。

sprite的博客 1267

Java中自定义注解

注解是一种元数据,可以被添加到Java代码中的任何元素上,包括类、字段、方法、参数等。在Java中,注解以 @ 符号开头,后跟注解名称和可选的注解参数。这里我们定义了一个名为 MyAnnotation 的注解,它唯一的属性为 value,类型为字符串类型,并且设置了默认值为空字符串。参数校验:可以自定义一些参数校验的注解,例如 @NotNull、@NotBlank等,来提高代码的健壮性。总之,自定义注解可以使我们的代码更加简洁、明了、易于维护,提高了代码的可读性和可维护性。四、自定义注解的应用场景。

weixin_65837469的博客 6047

LangChain学习及应用(超详细)

Model I/O 部分是与语言模型进行交互的核心组件,包括输入提示(Prompt Template)、调用模型(Model)、输出解析(Output Parser)。简单来说,就是输入、处理、输出这三个步骤。LLM 因其具有海量参数,需要花费相当的物力与时间成本进行预训练和微调,同时商用 LLM 还需要进行各种安全测试与风险评估等。因此 LLM 会存在知识滞后的问题。在专有领域,LLM 无法学习到所有的专业知识细节,因此在面向专业领域知识的提问时,无法给出可靠准确的回答。

weixin_39764056的博客 4233

RAG项目简历包装指南:从“流水线工人”到“问题解决者”的跃迁(附代码与思路)

本文代码已在Python 3.11 + CUDA 12.3环境测试,部分功能需LangChain 0.2+支持。

Conan_0728的博客 1885

java中注解的定义、创建和使用

1,注解概述 什么是注解:Annotation注解,是一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次 对比注释: ​ 注释是给程序员看的,注解是给程序看的。(注解不会影响代码的正常执行) 注解的作用: ​ 主要用于取代 XML 和 properties 配置文件 2,JDK提供的注解 注解 说明 @Deprecated 表示被修饰的方法已经过时。过时的方法不建议使用,但仍可以使用 @Override JDK5.0 表示复写父类的方法;jdk6

qq_45752401的博客 4368

YOLO 线性小目标涨点|3890 张输电导线散股 VOC+YOLO 单类别数据集实战,无人机电力缺陷巡检全流程落地

架空输电导线是电网能量传输核心载体,长期受风力摆动、雷击、腐蚀、外力撞击作用,外层铝股极易出现断裂散股故障。导线散股初期仅少量铝丝开裂,肉眼与无人机远距离航拍下属于细长微弱线性小目标;若未及时发现,散股会持续扩张,引发导线过热、断线、大面积停电重大电力安全事故。传统人工巡检存在多重行业痛点:山区、跨江河线路人员无法攀爬登杆,高空作业人身坠落风险极高;无人机单次航拍产出数千张高清图片,人工逐帧筛查微小散股耗时 3-5 天,阴天、逆光、植被遮挡场景漏检率超 45;

lin_xiu的博客 52

JAVA实现自定义注解

该注解功能最为强大,其所标注的方法用于编写包裹业务模块执行的代码,通知的第一个参数必须是 ProceedingJoinPoint 类型。,@Pointcut切点表达式非常丰富,可以将 方法(method)、类(class)、接口(interface)、包(package) 等作为切入点,非常灵活,常用的有@annotation、@within、execution等方式,上面的示例使用的是@annotation方式,意思就是说被Spring扫描到方法上带有@annotation中的注解 就会执行切面通知。

weixin_46155048的博客 1万+

mindie部署qwen3-8b

2. 确认目录文件权限是否如下所示,若存在不匹配项,则参考以下命令修改权限。否则要stop容器之后重新start,重新从《以下是在容器中的操作》开始操作。ctrl +d 让命令停止之后,需要等待一段事件让其释放,否则还会有占用。1. 若安装路径为默认路径,执行如下命令,进入MindIE安装目录。# 配置CANN环境,默认安装在/usr/local目录下。3. 运行以下命令初始化各组件环境变量,并开启日志打印。如果报错,可能有些线程没法去除,删除容器重新操作。# 配置模型仓环境变量。以下是在容器中的操作。

andeyeluguo的博客 1035

链接文件及功能安全:基于Tasking的LSL链接文件知识点梳理及实际应用分析

本文旨在记录研究链接文件时所遇到的问题及个人理解,以便日后查阅。在探索过程中,我遇到了诸多问题,同时对链接文件有了初步的认识。通过记录这些问题与理解,我希望能够为后续的研究提供清晰的思路和有价值的参考。这不仅是对研究过程的总结,更是对未来学习和实践的有力支持。

梦想技术家 1103

Java实现自定义注解

Java实现自定义注解其实很简单,跟类定义差不多,只是属性的定义可能跟我们平时定义的属性略有不同,实现自定义注解需要最少指定两个基本条件:①注解的作用范围②注解的生命周期,那这两个范围怎么指定呢?这个问题问的很好,指定这两个条件,就需要使用到了Java为我们提供的元注解(所谓的元注解:其实就是Java自定义的注解,并且为这个注解赋予了含义,当编译器扫描到这个注解时,就知道该注解是什么作用!)

个人学习博客,不足之处,还望不吝赐教! 1万+

SAPIEN ManiSkill3 入门教程(一)

请注意,table.set_pose(pose) 设置的是演员在世界帧中的坐标系姿势。移除的实体可以再次添加到场景中,但已在场景中的实体则不能再次添加。显示器可以是物理的(如显示器),也可以是虚拟的(如 VNC)。我们可以通过 get_pose()、get_linear_velocity() 和 get_angular_velocity()获取演员的运动量(姿势、线速度、角速度)。现在,让我们创建一个斜坡。例如,您可能需要一个简单的碰撞形状来进行快速模拟,但却需要一个复杂的视觉形状来进行逼真的渲染。

机器人控制与仿真应用 3072

Java中的注解以及自定义注解

1、Annotation(注解) 概述 (1)、注解起到标识做用,比如Junit的@Test注解。 Junit会在运行时检查方法上是否存在此注解,如果存在,就通过反射来运行你的方法。注意标红的反射两个字,反射在注解里相当重要,写完你的自定义注解类后没啥用,必须要用反射才能让它动起来!所以需要对反射有了解,感兴趣的小可爱可以看下这篇:Java中的反射机制介绍 (2)、从 JDK 5.0 开...

曹举的个人博客 2万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Java自定义注解

Java-Java自定义注解 文章目录Java-Java自定义注解前言1、简介2、元注解3、自定义注解3.1 自定义注解3.2 数据模型使用注解3.3 定义一个“注解解析器”3.4 运行的代码3.5 结果 前言 Java 骚操作之一:自定义注解 1、简介 注解是一种能被添加到java源代码中的元数据,方法、类、参数和包都可以用注解来修饰。注解可以看作是一种特殊的标记,可以用在方法、类、参数和包上,程序在编译或者运行时可以检测到这些标记而进行一些特殊的处理。 2、元注解 元注解的作用就是负责注解其他注解

weixin_45020244的博客 1万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Java注解以及自定义注解

Java注解以及自定义注解

YIYIYI 1968

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Java自定义注解开发

一、JAVA注解 1、java注解的定义 Java注解是附加在代码中的一些元信息,用于一些工具在编译、 运行时进行解析和使用,起到说明、配置的功能。 注解相关类都包含在java.lang.annotation包中。 2、java注解的分类 2.1 JDK基本注解 2.1.1 @Override 重写 2.1.2 @Deprecated 已过时 2.1.3 @SuppressWarnings(value = ...

zxy15974062965的博客 7174

Java中自定义注解的使用

Java中自定义注解的使用

weixin_45565886的博客 3466

JAVA自定义注解以及应用

注解(Annotation)是 Java 5.0 引入的一种元数据形式。它提供了关于程序代码的额外信息,但本身不会直接影响程序的运行逻辑。自定义注解允许开发者定义自己的注解类型,用于标记类、方法、变量等程序元素,以传达特定的意图或提供配置信息。例如,可以定义一个自定义注解来标记需要进行性能监控的方法,或者标记一个需要进行权限验证的接口。

weixin_56693899的博客 1825

java如何自定义注解

一、什么是注解? 注解是一种能被添加到java源代码中的元数据,方法、类、参数和包都可以用注解来修饰。注解可以看作是一种特殊的标记,可以用在方法、类、参数和包上,程序在编译或者运行时可以检测到这些标记而进行一些特殊的处理。 二、自定义注解需要的基本元素 自定义注解需要用到的东西: 修饰符:访问修饰符必须为public,不写默认为pubic; 关键字:关键字为@interface; 注解名称: 注解名称为自定义注解的名称,使用时还会用到; 注解类型元素: 注解类型元素是注解中内容,可以理解成自定义接口的

m0_58680865的博客 4767

Java 注解解析获取及自定义

从源码解析如何获取注解信息,以及如何自定义注解。

glb168的博客 2406

Java自定义注解详解

/ 注解属性声明@MyAnnotation(value = "测试", name = "张三", age = 25, roles = {"admin", "user"})// 方法实现// 当只有value属性需要设置时,可以简写@MyAnnotation("测试")// 方法实现// 字段验证注解// 可验证的接口Java 8引入了@Repeatable元注解,允许在同一元素上多次使用同一注解。// 单个角色注解// 角色容器注解使用合适的保留策略。

yk_dflkg的博客 2988

Java注解,元注解,自定义注解的使用

自定义注解,需要使用@interface来定义,使用@interface自定义注解时,自动继承java.lang.annotation.Annotation接口。权限修饰符 @interface 注解名 {// 定义内容 String value() default "";// 参数类型 参数名 默认值;@interface 用来声明一个注解其中上面的表示这个注解需要提供一个String类型的参数,且其默认值为空字符串default ""value() 就是参数的名称。

m0_63622279的博客 1909
上一篇: 计算机网络体系结构划分
下一篇: docker安装RabbitMQ
magic_1024
博客等级 码龄9年 121粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值