Java基础进阶03-注解和单元测试

目录

一、注解

1.概述

2.作用

3.自定义注解

(1)格式

(2)使用

(3)练习

4.元注解

(1)概述

(2)常见元注解

(3)@Target

(4)@Retention

二、单元测试

1.概述

2.单元测试工具JUnit

3.JUnit特点

4.JUnit的使用

5.JUnit常用注解


一、注解

1.概述

注解是代码里的特殊标记,程序可以读取注解,一般用于替代配置文件

开发人员可以通过注解告诉类如何运行: 在Java技术里注解的典型应用:可以通过反射技术去得到类里面的注解,来决定怎么去运行类

2.作用

  • 标记(如重写@Override)

  • 约束并检查代码是否符合要求(如重写,代码有问题无法实现重写效果的话会报错)

  • 压制警告信息(如@SuppressWarnings(value = “all”)【表示压制所有的警告】)

  • 声明(如@Deprecated,表示过时)

3.自定义注解

(1)格式
  public @interface 注解名称{
      //属性类型:基本数据类型,String,Class,注解,枚举,以上类型的一维数组
      //特殊属性值Value,我们在使用注解的时候,如果我们只给注解的value属性赋值,那么value=可省略
        public 属性类型 属性名() default 默认值
    }
public @interface text{
    public String[] STRINGS() ;
}
public @interface text02{
    public String[] value();
}
(2)使用
//直接在要使用的位置上@注解名即可
//注意:在使用注解的时候如果注解里面的属性没有指定默认值,那么我们就需要手动给出注解属性的设置值。
@text(STRINGS = {"1","2","3"})
public static void main(String[] args) {
​
}

@text02({"1","2","3"})
public static void main(String[] args) {
​
}
 

(3)练习

自定义一个注解(@随意),用于指定类的方法上,如果某一个类的方法上使用了该注解,就执行该方法

注解:

//表示这个注解的存活时间
@Retention(value = RetentionPolicy.RUNTIME)
@interface sign{
    public String value();
}

方法类:

public class Methods {
    void method01() {
        System.out.println("方法一运行了");
    }
    @sign("true")
    void method02() {
        System.out.println("方法二运行了");
    }
​
    void method03() {
        System.out.println("方法三运行了");
    }
    @sign("true")
    void method04() {
        System.out.println("方法四运行了");
    }
    @sign("true")
    void method05() {
        System.out.println("方法五运行了");
    }
}

测试类:

public class NoteDemo {
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        //1.通过反射获取Methods类的字节码文件
        Class<Methods> methodsClass = Methods.class;
        //1.1通过无参构造创建对象
        Methods methods1 = methodsClass.getDeclaredConstructor().newInstance();
        //2.获取所有方法对象
        Method[] methods = methodsClass.getDeclaredMethods();
        //3.遍历方法
        for (Method method : methods) {
            //判断是否有注解,参数是注解的字节码文件
            //isAnnotationPresent(类<? extends Annotation> annotationClass)
            if (method.isAnnotationPresent(sign.class)) {
                method.invoke(methods1);
            }
        }
​
    }
}

4.元注解

(1)概述

描述元注解的注解(写在注解上面的注解)

(2)常见元注解
元注解名说明
@Target指定了注解能在哪里使用(成员变量,类,方法)
@Retention注解保留时间(声明周期)【不写默认是源码阶段】
@Inherited表示修饰的自定义注解可以被子类继承
@Documented表示该自定义注解,会出现在API文档里面

(3)@Target
  • 成员变量:

@Target({ElementType.FIELD})
@interface sign{
    public String value();
}
  • 类:

@Target({ElementType.TYPE})
@interface sign{
    public String value();
}
  • 方法

@Target({ElementType.METHOD})
@interface sign{
    public String value();
}

如果是多个参数,用,隔开

(4)@Retention
  • 源码阶段(默认):注释只在java文件中生效,java文件编译变为class文件后,注解会消失

  • 运行时阶段:java文件编译变为class文件后,注解不会消失

@Retention(value = RetentionPolicy.RUNTIME)
@interface sign{
    public String value();
}

二、单元测试

1.概述

单元测试是对单个代码模块的正确性的测试

2.单元测试工具JUnit

JUnit是一个Java编程语言的单元测试工具。JUnit是一个非常重要的测试工具。

3.JUnit特点

  • JUnit是一个开放源代码的测试工具

  • 提供注解来识别测试方法

  • JUnit测试可以让你编写代码更快,并能提高质量JUnit 优雅简洁。没那么复杂,花费时间较少

  • JUnit 在一个条中显示进度。如果运行良好则是绿色,如果运行失败,则变成红色

4.JUnit的使用

  • 将JUnit的jar包导入到工程中(前面有教程,后续就不讲了)

  • 编写测试方法:该测试方法必须是公共的无参数无返回值的非静态方法

  • 在测试方法上使用@Test注解标注该方法是一个测试方法

  • 选中测试方法右键通过junit运行该方法

首先下一个包,我用的是junit-4.13.2

测试一下

报错了,看一下异常信息,少导了一个jar包,去下载一个

问题解决~

5.JUnit常用注解

注解名称说明
@Test表示测试该方法
@Before在测试的方法前运行
@After在测试的方法后运行

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第13次修改了可删除可持久保存的前端html备忘录:删除按钮靠右,做了一个背景主题:现代深色

第13次修改了可删除可持久保存的前端html备忘录&#xff1a;删除按钮靠右&#xff0c;做了一个背景主题&#xff1a;现代深色 备忘录代码 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"vi…

LFU算法

LFU算法 Least Frequently Used&#xff08;最不频繁使用&#xff09; Leetcode有原题&#xff0c;之前手写过LRU&#xff0c;数据结构还是习惯于用java实现&#xff0c;实现是copy的评论题解。 题解注释写的很清楚 大致就是说LFUCache类维护一个存放node的map&#xff0c;同…

立创EDA学习:设计收尾工作

布线整理 ShiftM&#xff0c;关闭铺铜显示 调整结束后再使用快捷键”ShiftM“打开铺铜 过孔 在空白区域加上一些GND过孔&#xff0c;连接顶层与底层的铺铜。放置好”过孔“后&#xff0c;隐藏铺铜&#xff0c;观察刚才放置的过孔有没有妨碍到其他器件 调整铺铜 先打开铺铜区&…

php mysql字段默认值使用问题

前提是使用了事务&#xff0c;在第一个阶段 是A表操作保存&#xff0c;第二阶段操作B表&#xff0c;操作B表的时候使用了A表的一个字段&#xff0c;这个字段在第一阶段没有设置值&#xff0c;保存的时候使用字段默认值。 【这种情况 最好是在第一阶段 把后面要使用的字段设置好…

C#在图片上输出文字和保存

winform&#xff0c;图片控件&#xff0c;加载一个图片&#xff0c;在图片上输出文字&#xff1b; 输出文字的代码如下&#xff1b; private void pictureBox1_Paint(object sender, PaintEventArgs e){Graphics g1 e.Graphics;g1.DrawString("测试", this.Font, B…

物联网IOT视频设备如何快速对接阿里云生活物联网(Link Visual)并成功上云?

原文永久更新地址&#xff1a;https://www.yundashi168.com/472.html 文章来源&#xff1a;猿视野 如果有图片看不清楚&#xff0c;加载不出来&#xff0c;请阅读原文。 什么是Link Visual、 Link Visual是生活物联网平台针对视频产品推出的增值服务&#xff0c;提供视频数据上…

指针的深入理解1

1.如何理解指针 假设有一栋宿舍楼&#xff0c;把你放在楼里&#xff0c;楼上有100个房间&#xff0c;但是房间没有编号&#xff0c;你的一个朋友来找你玩&#xff0c; 如果想找到你&#xff0c;就得挨个房子去找&#xff0c;这样效率很低&#xff0c;但是我们如果根据楼层和楼…

C#,恩廷格尔组合数(Entringer Number)的算法与源程序

恩廷格尔组合数&#xff08;Entringer Number&#xff09;组合数学的序列数字之一。 E&#xff08;n&#xff0c;k&#xff09;是{1&#xff0c;2&#xff0c;…&#xff0c;n1}的排列数&#xff0c;从k1开始&#xff0c;先下降后上升。 计算结果&#xff1a; 源代码&#xf…

用Excel辅助做数独

做数独游戏的时候&#xff0c;画在纸上很容易弄花眼&#xff0c;所以我考虑用Excel辅助做一个。 界面如下&#xff1a; 按下初始化表格区域按钮&#xff0c;会在所有单元格中填充“123456789”。如下图&#xff1a; 当某个单元格删除得只剩一个数字时&#xff0c;会将同一行、…

[UI5 常用控件] 03.Icon, Avatar,Image

文章目录 前言1. Icon2. Avatar2.1 displayShape2.2 initials2.3 backgroundColor2.4 Size2.5 fallbackIcon2.6 badgeIcon2.7 badgeValueState2.8 active 3. Image 前言 本章节记录常用控件Title,Link,Label。 其路径分别是&#xff1a; sap.m.Iconsap.m.Avatarsap.m.Image 1…

C++面试:散列表

目录 1. 散列表的基本概念 散列表的定义 散列函数 哈希冲突 2. 处理冲突的方法 链地址法&#xff08;Separate Chaining&#xff09; 开放地址法 再散列 3. 散列表的性能分析 1. 平均查找长度&#xff08;ASL&#xff09; 2. 负载因子&#xff08;Load Factor&#…

CAD-autolisp(二)——选择集、命令行设置对话框、符号表

目录 一、选择集1.1 选择集的创建1.2 选择集的编辑1.3 操作选择集 二、命令行设置对话框2.1 设置图层2.2 加载线型2.3 设置字体样式2.4 设置标注样式&#xff08;了解即可&#xff09; 三、符号表3.1 简介3.2 符号表查找3.2 符号表删改增 一、选择集 定义&#xff1a;批量选择…

go语言(十八)---- goroutine

一、goroutine package mainimport ("fmt""time" )func main() {//用go创建承载一个形参为空&#xff0c;返回值为空的一个函数go func() {defer fmt.Println("A.defer")func() {defer fmt.Println("B.defer")//退出当前goroutinefmt…

《WebKit 技术内幕》学习之十五(6):Web前端的未来

6 Chromium OS和Chrome的Web应用 6.1 基本原理 HTML5技术已经不仅仅用来编写网页了&#xff0c;也可以用来实现Web应用。传统的操作系统支持本地应用&#xff0c;那么是否可以有专门的操作系统来支持Web应用呢&#xff1f;当然&#xff0c;现在已经有众多基于Web的操作系统&…

跟无神学AI之Prompt

在大模型时代会写prompt变得很重要。 Prompt翻译为中文为提示词&#xff0c;在大模型的特定领域指的是大模型使用者给大模型提交的一种有一定格式的交互命令&#xff0c;让我们看看科大讯飞的大模型给出的答案—— Prompt是一种向人工智能模型提供的输入文本或指令&#xff0…

uv胶UV大灯修复液修复汽车车灯大灯尾灯?

使用UV胶进行汽车大灯修复是一种常见的方法&#xff0c;特别是用于修复裂纹、划痕或氧化的透明塑料表面。以下是使用UV胶修复汽车大灯的一般步骤&#xff1a; 1.准备工作&#xff1a; 确保汽车大灯表面是干净的&#xff0c;没有灰尘、油脂或其他污垢。可以使用清洁剂和软布进行…

Microsoft Remote Desktop for Mac(远程桌面连接)激活版

Microsoft Remote Desktop是一款由微软开发的远程桌面连接工具&#xff0c;它允许用户从另一台计算机或移动设备远程连接到Windows桌面或服务器。 以下是该软件的一些主要特点和功能&#xff1a; 跨平台支持&#xff1a;Microsoft Remote Desktop支持Windows、macOS、iOS和Andr…

leetcode:二叉树的中序遍历(外加先序,后序遍历)

题外&#xff1a;另外三种遍历可以看这&#xff1a; 层序遍历&#xff1a; Leetcode:二分搜索树层次遍历-CSDN博客 先序遍历&#xff1a; 二叉树的先序&#xff0c;中序&#xff0c;后序遍历-CSDN博客 后序遍历&#xff1a; 二叉树的先序&#xff0c;中序&#xff0c;后序…

网络安全全栈培训笔记(58-服务攻防-应用协议设备KibanaZabbix远控向日葵VNCTV)

第58天 服务攻防-应用协议&设备Kibana&Zabbix&远控向日葵&VNC&TV 知识点&#xff1a; 1、远程控制第三方应用安全 2、三方应用-向日葵&VNC&TV 3、设备平台-Zabbix&Kibanai漏洞 章节内容&#xff1a; 常见版务应用的安全测试&#xff1a; 1…

【Web】CTFSHOW SQL注入刷题记录(上)

目录 无过滤注入 web171 web172 web173 web174 web175 时间盲注 写马 过滤注入 web176 web177 web178 web179 web180 web181-182 web183 web184 web185-186 web187 web188 web189 web190 布尔盲注 web191 web192 web193 web194 堆叠注入 web195 …