Java注解语法

news2025/1/11 20:03:02

Java注解语法

1. 前置基础

​ 学习java反射语法 JAVA通过反射使用公共构造方法和私有构造方法来创建对象

2. Java注解是什么?

Java注解是代码中的特殊标记,比如@Override@Test等,作用是:让其他程序根据注解 信息决定怎么执行该程序。

​ 比如:Junit框架的@Test注解可以用在方法上,用来标记这个方法是测试方法,被@Test标记的方法能够被Junit框架执行。

​ 再比如:@Override注解可以用在方法上,用来标记这个方法是重写方法,被@Override注解标记的方法能够被IDEA识别进行语法检查。

注解不光可以用在方法上,还可以用在类上、变量上、构造器上等位置。

3. 自定义注解

3.1 自定义注解格式

public @interface 注解名称 {
    public 属性类型 属性名() default 默认值;
}

3.2 自定义注解Test:

​ 属性名称Test, 包含属性String aint b

public @interface Test{
    String a();
    int b() default 3;
}

3.3 使用注解Test

@Test(a="ggg",b=5) //@Test即为对自定义注解的使用语法形式
public class demo{
    
}

注意:注解的属性名如果是value的话,并且只有value没有默认值,使用注解时value名称可以省略。

public @interface Test{
    String value();
    int b() default 3;
    int c() defaule 5;
}

@Test("ggg") //@Test即为对自定义注解的使用语法形式
public class demo{}

4. 注解的本质

把注解的字节码进行反编译,使用XJad工具进行反编译。经过Test注解字节码反编译会发现:

1.Test注解本质上是接口,每一个注解接口都继承子Annotation接口
2.Test注解中的属性本质上是抽象方法
3.@Test实际上是作为MyTest接口的实现类对象
4.@Test(a="ggg",b=5) 里面的属性值,可以通过调用a()b()方法获取到。 

5. 元注解

元注解是修饰注解的注解,分别有注解@Retention@Target.

@Target是用来声明注解只能用在那些位置,比如:类上、方法上、成员变量上等
@Retetion是用来声明注解保留周期,比如:源代码时期、字节码时期、运行时期

在这里插入图片描述

@Target注解可以标识多个位置
语法: @Target({ElementType.TYPE,ElementType.METHOD})

6. 解析注解

​ 通过反射技术把类上、方法上、变量上的注解对象获取出来,然后通过调用方法就可以获取注解上的属性值了,该过程称为解析注解。

流程如下:

1.如果注解在类上,先获取类的字节码对象,再获取类上的注解
2.如果注解在方法上,先获取方法对象,再获取方法上的注解
3.如果注解在成员变量上,先获取成员变量对象,再获取变量上的注解
总之:注解在谁身上,就先获取谁,再用谁获取谁身上的注解

Class、Method、Filed、Constructor都实现了AnnotatedElement接口,都具有解析注解的能力。

在这里插入图片描述

示例:

1. 定义注解

 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
 @Retention(RetentionPolicy.RUNTIME)
 @Target({ElementType.TYPE, ElementType.METHOD})
 public @interface Test {
     String a();
     int b() default 3;
     boolean c();
 }

2. 定义Demo类并使用该注解。

@Test(a="first", b=5, c=false)
public class Demo {
    @Test(a="first", b=5, c=false)
    public void demoTest(){}
}

3. 编写测试类获取注解中的值。

import java.lang.reflect.Method;

public class AnnotatedTest {
    public static void main(String[] args) throws Exception {

        // 获取类上注解属性
        // 1.获取Demo的class对象
        Class demoClass = Demo.class;
        // 2.获取类上的注解
        if(demoClass.isAnnotationPresent(Test.class)){
            Test test= (Test) demoClass.getDeclaredAnnotation(Test.class);
            System.out.println(test.a());
            System.out.println(test.b());
            System.out.println(test.c());
            System.out.println("-------------------");
        }

        // 获取方法上注解属性
        Method demoTest = demoClass.getDeclaredMethod("demoTest");
        // 2.获取类上的注解
        if(demoTest.isAnnotationPresent(Test.class)){
            Test test= (Test) demoTest.getDeclaredAnnotation(Test.class);
            System.out.println(test.a());
            System.out.println(test.b());
            System.out.println(test.c());
            System.out.println("-------------------");
        }
        
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【ECCV2022】Swin-Unet: Unet-like Pure Transformer for Medical Image Segmentation

Swin-Unet: Unet-like Pure Transformer for Medical Image Segmentation 论文:https://arxiv.org/abs/2105.05537 代码:https://github.com/HuCaoFighting/Swin-Unet 解读:Swin-UNet:基于纯 Transformer 结构的语义分割网络 -…

【FAQ】视频云存储/安防监控EasyCVR视频汇聚平台如何通过角色权限自行分配功能模块?

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同,支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。音视频流媒体视频平台EasyCVR拓展性强,视频能力丰富,具体可实现视频监控直播、视频轮播、视频录像、…

SpringMVC 写个 HelloWorld

文章目录 一、SpringMVC简介1、什么是MVC2、什么是SpringMVC3、SpringMVC的特点 二、HelloWorld1、开发环境2、创建maven工程a>添加web模块b>打包方式:warc>引入依赖 3、配置web.xmla>默认配置方式b>扩展配置方式 4、创建请求控制器5、创建springMVC…

Linux下彻底卸载jenkins

文章目录 1、停服务进程2、查找安装目录3、删掉相关目录4、确认已完全删除 1、停服务进程 查看jenkins服务是否在运行,如果在运行,停掉 ps -ef|grep jenkins kill -9 XXX2、查找安装目录 find / -name "jenkins*"3、删掉相关目录 # 删掉相…

继承(C++)

继承 一、初识继承概念“登场”语法格式 继承方式九种继承方式组合小结(对九种组合解释) 二、继承的特性赋值转换 一一 切片 / 切割作用域 一一 隐藏 / 重定义 三、派生类的默认成员函数派生类的默认成员函数1. 构造函数2. 拷贝构造3. 赋值运算符重载4. …

部署FTP服务(二)

目录 2.访问FTP服务 1.使用ftp命令行工具 2.使用浏览器 3.使用FileZilla Client 3.Serv-U 1.定义新域 2.创建用户 4. windowsserver搭建ftp服务器 一、FTP工具 二、Windows资源管理器 三、IE浏览器访问 2.访问FTP服务 下面在一台装有Windows10操作系统的计算机中&#…

vue 简单实验 v-on html事件绑定

1.代码 <script src"https://unpkg.com/vuenext" rel"external nofollow" ></script> <div id"event-handling"><p>{{ message }}</p><button v-on:click"reverseMessage">反转 Message</but…

医药市场调研--原始价值数据库分享<医药行业必读>

医药市场调研公司是专门从事医药行业市场调研的企业。它们的主要职责是收集、分析和解读与医药行业相关的市场数据和信息&#xff0c;为企业提供决策支持和战略指导。这些公司通过各种调研方法和工具&#xff0c;如市场调查、数据分析、定性研究等&#xff0c;帮助企业了解市场…

TCP的三次握手 四次挥手以及TCP的11种状态

三次握手流程&#xff1a; 客户端给服务端发送数据时&#xff0c;数据包中带有一个头&#xff0c;这个头就是前几十个字节&#xff0c;就是下面这张图。从源端口号&#xff0c;目的端口号&#xff0c;一直到序列号&#xff0c;直到Options。第一个包会将这前十几个字节中的SYN置…

【从零学习python 】72. 深入理解Socket通信及创建套接字的方法

文章目录 1. 不同电脑上的进程之间如何通信2. 什么是socket3. 创建socket进阶案例 1. 不同电脑上的进程之间如何通信 首要解决的问题是如何唯一标识一个进程&#xff0c;否则通信无从谈起&#xff01; 在1台电脑上可以通过进程号&#xff08;PID&#xff09;来唯一标识一个进程…

取模运算符在数组下标的应用

什么是取模运算符%&#xff1f; 定义&#xff1a; a mod b&#xff0c;设a、b属于正整数且b>0&#xff0c;如果q、r属于正整数满足aq*br&#xff0c;且0≤r<b&#xff0c;则定义&#xff1a; a mod b r 注意&#xff1a;取模运算符两侧的除数和被除数都是整数&#xff…

中秋节思维导图怎么绘制?教你使用这种绘制方法

中秋节思维导图怎么绘制&#xff1f;中秋节是中国传统的一个重要节日&#xff0c;许多人会在这一天与家人、朋友聚在一起庆祝&#xff0c;品尝月饼、猜灯谜、赏月等。中秋节作为一个具有浓厚文化底蕴的节日&#xff0c;其历史文化知识十分丰富&#xff0c;而通过绘制思维导图&a…

Three.js 实现模型材质局部辉光(发光,光晕)效果和解决辉光影响场景背景图显示的问题

1.Three.js 实现模型材质局部辉光&#xff08;发光&#xff0c;光晕&#xff09;效果 2.解决辉光效果影响场景背景图显示的问题 相关API的使用&#xff1a; 1. EffectComposer&#xff08;渲染后处理的通用框架&#xff0c;用于将多个渲染通道&#xff08;pass&#xff09;组…

iPhone 14 Pro 动态岛的功能和使用方法详解

当iPhone 14 Pro机型发布时,苹果公司将软件功能与屏幕顶部的药丸状切口创新集成,称之为“灵动岛”,这让许多人感到惊讶。这篇文章解释了它的功能、工作原理,以及你如何与它互动以执行动作。 一、什么是灵动岛?它是如何工作的 在谣言周期的早期‌iPhone 14 Pro‌ 在宣布时…

只考一门数据结构,计算机学硕复录比1:1的山东双非学校考情分析

青岛理工大学 考研难度&#xff08;☆&#xff09; 内容&#xff1a;23考情概况&#xff08;拟录取和复试分析&#xff09;、院校概况、23专业目录、23复试详情、各专业考情分析、各科目考情分析。 正文1420字&#xff0c;预计阅读&#xff1a;3分钟 2023考情概况 青岛理工…

Linux下的系统编程——基础操作(一)

前言&#xff1a; linux系统编程是基于Linux系统进行程序开发的一个过程&#xff0c;主要涉及到的是linux系统中的函数使用如下图所示&#xff1a; 最外层的是咱们的应用程序&#xff0c;这部分程序大多调用的是咱们标准库&#xff0c;或者说是C库&#xff0c;这部分库函数能…

PDF中的表格怎么转换为Excel?这两个工具一定得收藏!

PDF是一种常见的文件格式&#xff0c;它可以保持文件的原始样式和内容&#xff0c;但是也有一些缺点&#xff0c;比如不易编辑和处理数据。如果你想要将PDF中的表格或数据导出到Excel中&#xff0c;以便进行分析、计算或制作图表&#xff0c;那么你可能需要一个专业的PDF转Exce…

Window异常提示:“为了对电脑进行保护,已经阻止此应用”

目录 1.Window异常提示图片&#xff1a; 2.家庭版额外需要执行的解决方式&#xff1a; 3.本地组策略编辑器(后续家庭版和专业版一致) 4.禁用后重新启动电脑就可以正常运行程序了 1.Window异常提示图片&#xff1a; 2.家庭版额外需要执行的解决方式&#xff1a; 代码&#xff…

超纯水中硼离子去除,特种除硼树脂CH-99

超纯水是指水中杂质含量极低的一种水质&#xff0c;其中矢量硼是一种常见的杂质。矢量硼的存在会影响超纯水的质量&#xff0c;因此需要采取一定的方法去除。 常用的去除矢量硼的方法有离子交换法、反渗透法和电化学法等。 电化学法&#xff1a; 是一种利用电化学反应对水中…

Java JDBC学习教程

Java JDBC JDBC 独立于数据库JDBC 不独立于SQLJDBC 不适用于非关系数据库流行的关系数据库JDBC 教程范围JDBC 核心概念JDBC 示例加载JDBC驱动程序打开数据库连接创建语句更新数据库查询数据库关闭数据库连接 Java JDBC API&#xff08;Java Database Connectivity&#xff09…