《Java-SE-第三十八章》之注解

news2025/1/19 20:28:23

前言

在你立足处深挖下去,就会有泉水涌出!别管蒙昧者们叫嚷:“下边永远是地狱!”

博客主页:KC老衲爱尼姑的博客主页

博主的github,平常所写代码皆在于此

共勉:talk is cheap, show me the code

作者是爪哇岛的新手,水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!


文章目录

  • 注解
    • 概述
      • 注解的作用
      • 元注解
      • 注解的解析
      • 模拟Junit中的@Test


注解

概述

Java注解是Java5引入的一种注释解释,又称之为标注。Java中的类,构造器,方法,成员变量,参数等都可以被注解进行标注。我们可以将注解理解为标签,标签可以上的内容可以自由的定义,它是对人和事物属性的评价。这就如商品上的价格标签,图书馆中的书本编码标签,B站上游戏分区标签等。

注解的作用

对Java中类,方法,成员变量做标记,然后进行特殊处理,至于到底进行何种处理由具体业务决定。比如说:JUnit框架中,标注了注解为@Test的方法就可以被当成测试方法执行,而没有标记的就不能打算当初当成测试方法执行。

特殊属性

  • value属性,如果只有一个value属性的情况下,使用value属性的时候可以省略value名称不写。
  • 但是如果有多个属性,并且属性没有默认值,那么value名称不能省略。

自定义注解格式

public @interface 注解名称 {

​ public 属性类型 属性名() default 默认值;

}

代码示例

public @interface MyDemo {
    String value();
    String name();
    boolean flag() default true;
    String [] str();
}

元注解

元注解就是注解的注解,注解的标签。

常用的元注解

  1. @Target: 约束自定义注解只能在哪些地方使用
  2. @Retention:申明注解的生命周期

@Target中可使用的值定义在枚举类ElementType中,常用值如下:

  • TYPE,类
  • 接口 FIELD,
  • 成员变量METHOD,
  • 成员方法PARAMETER,
  • 方法参数CONSTRUCTOR,
  • 构造器LOCAL_VARIABLE
  • 局部变量

@Retention中可使用的值定义在枚举类ElementType中,常用值如下:

  • SOURCE: 注解只作用在源码阶段,生成的字节码文件中不存在
  • CLASS: 注解作用在源码阶段,字节码文件阶段,运行阶段不存在,默认值.
  • RUNTIME:注解作用在源码阶段,字节码文件阶段,运行阶段(开发常用)

注解的解析

示例代码

@Target({ElementType.TYPE,ElementType.METHOD})// 当前被修饰的注解只能用在类上,方法上。
@Retention(RetentionPolicy.RUNTIME)// 控制下面的注解一直保留到运行时
public @interface  MyTest {
}

MyTest的使用

@MyTest
public class AnnotationTest {
//    @MyTest
//    private String name;

    @MyTest
    @MyDemo(value = "Annotation",name="张三",str={"java","C++"})
    public static void test() {
        System.out.println("Hello World");
    }

    public static void main(String[] args) {
        test();
    }
}

如果把@MyTest修饰在成员变量上就会报错—>java: 注释类型不适用于该类型的声明

注解的解析

注解的操作中经常需要解析,注解的解析就是判断是否存下注解,存在注解就解析出内容。

与注解解析相关的接口

  • Annotation: 注解的顶级接口,注解都是Annotation类型的对象
  • AnnotatedElement:该接口定义了与注解解析相关的解析方法

相关API如下

方法说明
Annotation[] getDeclaredAnnotations()获得当前对象上使用的所有注解,返回注解数组。
T getDeclaredAnnotation(Class annotationClass)根据注解类型获得对应注解对象
boolean isAnnotationPresent(Class annotationClass)判断当前对象是否使用了指定的注解,如果使用了则返回true,否则false

所有的类成分Class, Method , Field , Constructor,都实现了AnnotatedElement接口他们都拥有解析注解的能力。

注解解析案例

首先定义一个MyTest2注解

@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTest2 {
    String value();
    String name();
    boolean flag() default true;
    String [] str();
}

在Demo类和方法上使用

@MyTest2(value = "大小姐",name ="林黛玉",str={"java","C++"})
public class Demo {
    @MyTest2(value = "小小姐",name ="薛宝钗",str={"java","Python"})
    public void test() {

    }

}

解析类上的注解

public class AnnotationTest2 {
    public static void main(String[] args) {
        //1.得到class对象
        Class<Demo> demoClass = Demo.class;
        //2.判断类上是否包含注解
        if (demoClass.isAnnotationPresent(MyTest2.class)) {
            MyTest2 myTest2 = demoClass.getDeclaredAnnotation(MyTest2.class);
            System.out.println(myTest2.value());
            System.out.println(myTest2.name());
            System.out.println(myTest2.flag());
            System.out.println(Arrays.toString(myTest2.str()));
        }
    }
}

运行结果:
在这里插入图片描述

解析方法上的注解

public class AnnotationTest3 {

    public static void main(String[] args) throws NoSuchMethodException {
        //1.得到class对象
        Class<Demo> demoClass = Demo.class;
        Method test = demoClass.getDeclaredMethod("test");
        //2.判断方法对象上是否包含注解
        if (test.isAnnotationPresent(MyTest2.class)) {
            MyTest2 myTest2 = test.getDeclaredAnnotation(MyTest2.class);
            System.out.println(myTest2.value());
            System.out.println(myTest2.name());
            System.out.println(myTest2.flag());
            System.out.println(Arrays.toString(myTest2.str()));
        }
    }
}

运行结果:

在这里插入图片描述

模拟Junit中的@Test

我们定义若干个方法,只要加了MyTest注解,就可以在启动时被触发执行

分析

  1. 定义一个自定义注解MyTest,只能注解方法,存活范围是一直都在。
  2. 定义若干个方法。只要有@MyTest注解的方法就能在启动时被触发执行,没有这个注解的方法不能执行。

示例代码

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class TestDemo {
    @MyTest
    public void test1() {
        System.out.println("test1");
    }
    @MyTest
    public void test2() {
        System.out.println("test2");
    }
    @MyTest
    public void test3() {
        System.out.println("test3");
    }
    @MyTest
    public void test4() {
        System.out.println("test4");
    }

    public static void main(String[] args) throws InvocationTargetException, IllegalAccessException {
        TestDemo t = new TestDemo();
        //启动程序
        //1.得到TestDemo对象
        Class<TestDemo> testDemoClass = TestDemo.class;
        //提取类中的方法
        Method[] declaredMethods = testDemoClass.getDeclaredMethods();
        //触发方法
        for (Method method : declaredMethods) {
            if (method.isAnnotationPresent(MyTest.class)) {
                method.invoke(t);
            }
        }
    }
}

运行结果:

在这里插入图片描述

各位看官如果觉得文章写得不错,点赞评论关注走一波!谢谢啦!。

在这里插入图片描述

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

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

相关文章

每日记--前端解决方案--el-select下拉样式-el-option内容过长-鼠标悬停到文字不修改光标样式-设置透明

文章目录 el-select下拉样式el-select中el-option内容过长解决办法鼠标悬停到文字不修改光标样式设置透明 el-select下拉样式 element-ui自带样式设置popper-class el-select中el-option内容过长解决办法 问题&#xff1a;像这样选项太长了&#xff0c;不好看 解决&#xf…

关于Linux文件系统只读问题的修改笔记

1.问题 2. 原因 系统异常关机或者代码修改错误导致硬盘挂载出现问题开启只读模式&#xff0c;但是重启有时候可以解决。 3.解决方法 1. mount查看那个挂载的硬盘出现问题(ro标识只读) mount | grep ro2.找到硬盘&#xff0c;重新挂载即可 sudo mount -o remount,rw /sys/f…

半导体市场震荡,硅晶圆价格下修成焦点 | 百能云芯

半导体市场状况不容乐观&#xff0c;原本被半导体晶圆制造厂视为稳定业绩的长期合同开始面临松动。行业内传出&#xff0c;国内重要的晶圆代工大厂已向日本硅晶圆供应商提出要求降低明年合同价格的请求&#xff0c;以共同应对困境&#xff0c;双方目前正处于激烈的博弈中。鉴于…

测试相关Liunx基础知识

Linux的历史和安装 基本常识 Liunx目录结果 常见

1€滤波器(1 Euro Filter)使用介绍

怎么调整欧拉角x、y、z的抖动问题&#xff1f;

python+django+mysql项目实践四(信息修改+用户登陆)

python项目实践 环境说明: Pycharm 开发环境 Django 前端 MySQL 数据库 Navicat 数据库管理 用户信息修改 修改用户信息需要显示原内容,进行修改 通过url传递编号 urls views 修改内容需要用数据库的更新,用update进行更新,用filter进行选择 输入参数多nid,传递要修…

数据结构--有向⽆环图 描述表达式

数据结构–有向⽆环图 描述表达式 有向⽆环图 \color{red}有向⽆环图 有向⽆环图&#xff1a;若⼀个有向图中 不存在环 \color{red}不存在环 不存在环&#xff0c;则称为有向⽆环图&#xff0c;简称 D A G 图 \color{red}DAG图 DAG图&#xff08;Directed Acyclic Graph&#x…

2021年09月 C/C++(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题&#xff1a;字符统计 给定一个由a-z这26个字符组成的字符串&#xff0c;统计其中哪个字符出现的次数最多。 输入 输入包含一行&#xff0c;一个字符串&#xff0c;长度不超过1000。 输出 输出一行&#xff0c;包括出现次数最多的字符和该字符出现的次数&#xff0c;中间以…

autodock后的pdbqt文件怎么通过网站分析?

首先需要在pymol中打开这个docking后的分子 然后再打开受体&#xff0c; 注意&#xff1a;顺序不要反&#xff0c;顺序反了会导致网址分析错误 最后导出为pdb就可以了放在网站上用了 网址&#xff1a;https://plip-tool.biotec.tu-dresden.de/plip-web/plip/index

RK3568KK操作手册

一&#xff0e;烧录MCU 板子不用上电&#xff0c;接上烧录器 打开 HOPE3000 For e-Link 烧录软件。选择文件&#xff0c;选择要烧录的固件&#xff1a;HT66F2030.MTP 选择3V 点击下载&#xff0c; 点击所有 烧录成功如图所示&#xff1a; 二&#xff0e;接上电源&am…

什么是自动化测试?如何做自动化测试?

前面介绍了功能测试和接口测试&#xff0c;在介绍接口测试时提到了实现API自动化。那具体什么是自动化&#xff0c;为什么要做自动化&#xff0c;这里我们集中总结。 一. 什么是自动化&#xff1f; 顾名思义&#xff0c;自动化测试是相对人工测试而言的&#xff0c;它是指把人…

易云维®医院后勤一站式服务平台实现对医院人、物、设备进行信息化管理

传统后勤移动系统的缺陷 使用的门槛和成本高。在国内只有一些大医院开展及应用&#xff0c;由于传统移动运维系统需要定制软件、结合专用平板使用&#xff0c;导致整体项目价格昂贵&#xff0c;故一般采购医院配置的平板少&#xff0c;从而影响记录实时互动追踪的效果&#xf…

如何克服预测性维护中IT和OT的融合挑战?

预测性维护&#xff08;Predictive Maintenance&#xff0c;简称PdM&#xff09;在现代制造业中扮演着关键角色&#xff0c;通过实时数据分析和资产监控&#xff0c;帮助企业预测设备故障&#xff0c;优化维护计划&#xff0c;并提高生产效率。然而&#xff0c;PdM的成功实施面…

无法解析的外部符号cusolverDnCreate

问题&#xff1a; 无法解析的外部符号cusolverDnCreate 解决方案 那么就在启动项目-》属性-》连接器-》输入-》附加依赖项&#xff1a;加&#xff1a; cublas.lib cublas_device.lib cuda.lib cudadevrt.lib cudart.lib cudart_static.lib cufft.lib cufftw.lib curand.lib …

Flink 流式读写文件、文件夹

文章目录 一、flink 流式读取文件夹、文件二、flink 写入文件系统——StreamFileSink三、查看完整代码 一、flink 流式读取文件夹、文件 Apache Flink针对文件系统实现了一个可重置的source连接器&#xff0c;将文件看作流来读取数据。如下面的例子所示&#xff1a; StreamExe…

编写一个通用函数,从键盘输入n,显示正n边形。通过调用函数,在屏幕上同时显示下面的四个图形

题目&#xff1a;编写一个通用函数&#xff0c;从键盘输入n&#xff0c;显示正n边形。通过调用函数&#xff0c;在屏幕上同时显示下面的四个图形。 结果&#xff1a; 调用举例&#xff1a; drawShape(3)drawShape(4)drawShape(5)drawShape(6) 代码&#xff1a; import turt…

数据库MySQL 创建查询恢复数据库

创建数据库 查询数据库 备份恢复数据库

【Docker】 使用Docker-Compose 搭建基于 WordPress 的博客网站

引 本文将使用流行的博客搭建工具 WordPress 搭建一个私人博客站点。部署过程中使用到了 Docker 、MySQL 。站点搭建完成后经行了发布文章的体验。 WordPress WordPress 是一个广泛使用的开源内容管理系统&#xff08;CMS&#xff09;&#xff0c;用于构建和管理网站、博客和…

【深入理解ES6】块级作用域绑定

1. var声明及变量提升机制 提升&#xff08;Hoisting&#xff09;机制&#xff1a;通过关键字var声明的变量&#xff0c;都会被当成在当前作用域顶部生命的变量。 function getValue(condition){if(condition){var value "blue";console.log(value);}else{// 此处…

7-2 成绩转换

分数 15 全屏浏览题目 切换布局 作者 沈睿 单位 浙江大学 本题要求编写程序将一个百分制成绩转换为五分制成绩。转换规则&#xff1a; 大于等于90分为A&#xff1b;小于90且大于等于80为B&#xff1b;小于80且大于等于70为C&#xff1b;小于70且大于等于60为D&#xff1b;小…