面向对象(高级)-Annotation注解、单元测试的使用

news2024/10/6 1:35:23

注解(Annotation)

注解大纲

注解的使用

1.Annotation的理解
- 注解(Annotation)是从'JDK5.0'开始引入,以'@注解名'在代码中存在。
- Annotation可以像修饰符一样被使用,可用于修饰包、类、构造器、方法、成员变量、参数、局部变量的声明。
  还可以添加一些参数值,这些信息被保存在Annotation"name = value"对中。
- 注解可以在类编译、运行时进行加载,体现不同的功能。

2.注解的应用场景:
示例1:生成文档相关的注解
示例2:在编译时进行格式检查(JDK内置的三个基本注解)
示例3:跟踪代码依赖性,实现替代配置文件功能


3.JAVA基础涉及到的三个常用的注解
@Override:限定重写父类方法,该注解只能用于方法
@Deprecated:用于表示所修饰的元素(类,方法等)已过时。通常是因为所修饰的结构危险或存在更好的选择
@SuppressWarnings:抑制编译器警告   IDEA代码右边滚动条底下黄色的小横杠就是各种警告信息,如没使用这个变量,方法过时等,
    如何取消小黄杠?
    鼠标指针放在小黄杠上,点击右下角的More Actions...(更多操作...)——点击黄色小灯泡最右边的向右三角形,选择Suppress...小黄杠就没了


4.自定义注解
以@SuppressWarnings为参照,进行定义即可。

5.元注解的理解:
元注解:对现有的注解进行解释说明的注解。

讲4个元注解:
(1. @Target:用于描述注解的使用范围
- 可以通过枚举类型ElementType10个常量对象来指定
- TYPE,METHOD,CONSTRUCTOR,PACKAGE......2. @Retention:用于描述注解的生命周期
- 可以通过枚举类型RetentionPolicy3个常量对象来指定
- SOURCE(源代码)、CLASS(字节码)、RUNTIME(运行时)
- 唯有RUNTIME阶段才能被反射读取到。

(3. @Documented:表明这个注解应该被Javadoc工具记录。
(4. @Inherited:允许子类继承父类中的注解



拓展:元数据。
String name = "冰默";
String name是冰默的元数据

框架 = 注解 + 反射 + 设计模式
  • 什么是注解

    注解(Annotation)是从JDK5.0开始引入,以**@注解名**在代码中存在。例如:

@Override	//重写
@Deprecated		//表示相应的一些结构过时了
@SuppressWarnings(value = "unchecked")		//抑制编译器警告

​ Annotation可以像修饰符一样被使用,可用于修饰包、类、构造器、方法、成员变量、参数、局部变量的声明。还可以添加一些参数值,这些信息被保存在Annotation的"name = value"对中。

​ 注解可以在类编译、运行时进行加载,体现不同的功能。

  • 注解与注释

    注解也可以看做是一种注释,通过使用Annotation,程序员可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充信息。但是,注解,不同于单行注释和多行注释。

    • 对于单行注释和多行注释是给程序员看的。
    • 而注解是可以被编译器或其他程序读取的。程序还可以根据注解的不同,多出相应的处理。
  • 注解的重要性

在JavaSE中,注解的使用目的比较简单,例如标记过时的功能,忽略警告等。在JavaEE/Android中注解占据了更重要的角色,例如用来配置应用程序的任何切面,代替JavaEE旧版中所遗留的繁冗代码XML配置等。

未来的开发模式都是基于注解的,JPA是基于注解的,Spring2.5以上都是基于注解的,Hibernate3.x以后也是基于注解的,Struts2有一部分也是基于注解的了。注解是一种趋势,一定程度上可以说:框架 = 注解 + 反射 + 设计模式

常见的Annotation作用

示例1:生成文档相关的注解

@author 标明开发该类模块的作者,多个作者之间使用,分割
@version 标明该类模块的版本
@see 参考转向,也就是相关主题
@since 从哪个版本开始增加的
@param 对方法中某参数的说明,如果没有参数就不能写
@return 对方法返回值的说明,如果方法的返回值类型是void就不能写
@exception 对方法可能抛出的异常进行说明,如果方法没有用throws显示抛出的异常就不能写

示例2:在编译时进行格式检查(JDK内置的三个基本注解)

@Override:限定重写父类方法,该注解只能用于方法

@Deprecated:用于表示所修饰的元素(类,方法等)已过时。通常是因为所修饰的结构危险或存在更好的选择

@SuppressWarnings:抑制编译器警告

示例3:跟踪代码依赖性,实现替代配置文件功能

  • Servlet3.0提供了注解(annotation),使得不再需要在web.xml文件中进行Servlet的部署。

三个最基本的注解

  • @Override

    • 用于检测被标记的方法为有效的重写方法,如果不是,则报编译错误!
    • 只能标记在方法上。
    • 它会被编译器程序读取。
  • @Deprecated

    • 用于表示被标记的数据已经过时,不推荐使用。
    • 可以用于修饰属性,方法,构造,类,包,局部变量,参数。
    • 他会被编译器程序读取。
  • @SuppressWarnings

    • 抑制编译警告。当我们不希望看到警告信息的时候,可以使用SuppressWarnings注解来抑制警告信息。
    • 可以用于修饰类、属性、方法、构造、局部变量、参数。
    • 他会被编译器程序读取。
    • 可以指定的警告类型有(了解)
    1. all,抑制所有警告
    2. unchecked,抑制与未检查的作业相关的警告
    3. unused,抑制与未用的程式码及停用的程式码相关的警告
    4. deprecation,抑制与淘汰的相关警告
    5. nls,抑制与非nls字串文字相关的警告
    6. null,抑制与空值分析相关的警告
    7. rawtypes,抑制与使用raw类型相关的警告
    8. static -access,抑制与静态存取不正确相关的警告
    9. static- method,抑制与可能宣告为static的方法相关的警告
    10. super,抑制与置换方法相关但不含super呼叫的警告

元注解

JDK1.5在java.long.annotation包定义了4个标准的meat-annotation类型,它们被用来提供对其他annotation类型作说明。

  1. **@Target:**用于描述注解的使用范围
  • 可以通过枚举类型ElementType的10个常量对象来指定
  • TYPE,METHOD,CONSTRUCTOR,PACKAGE…
  1. **@Retention:**用于描述注解的生命周期
  • 可以通过枚举类型RetentionPolicy的3个常量对象来指定
  • SOURCE(源代码)、CLASS(字节码)、RUNTIME(运行时)
  • 唯有RUNTIME阶段才能被反射读取到
  1. @Documented:表明这个注解应该被Javadoc工具记录。

  2. @Inherited:允许子类继承父类中的注解


package oop.demo15_annotation;

import java.util.Date;

public class AnnotationTest {
    public static void main(String[] args) {
        //new Student().walk();
        Person p1 = new Student();
        p1.walk();//学生走路

        Date date = new Date();
        System.out.println(date);

        Date date1 = new Date(2023,4,11);//这是一个过时的方法,所以这个Date中间有条删除线,不推荐用,但是可以使用
        System.out.println(date1);//输出3923,这个过时的方法要减去1900,才能是2023

        Person p2 = new Person();
        @SuppressWarnings({"deprecation"}) Person p3 = new Person("小明");
        System.out.println(p3);

        @SuppressWarnings("unused") int num = 10;
    }
}

@MyAnnotation(value = "class")
class Person{
    String name;
    int age;

    @MyAnnotation()//没写,默认就是Hello
    //无参构造器
    public Person() {
    }

    //有参构造器
    @Deprecated //有了Deprecated说明以下方法为过时,上面用到这个方法的时候,这个方法名就有删除线
    public Person(String name) {
        this.name = name;
    }

    public void eat(){
        System.out.println("人干饭");
    }

    public void walk(){
        System.out.println("人走路");
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

class Student extends Person{

    @Override//注意Override只能够用来修饰方法
    public void eat() {
        System.out.println("学生干饭");
    }

    @Override
    public void walk(){
        System.out.println("学生走路");
    }
}

自定义注解:

package oop.demo15_annotation;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.ElementType.LOCAL_VARIABLE;

//自定义的注解
@MyAnnotation("自定义的注解")
@Target({TYPE,FIELD, METHOD,CONSTRUCTOR})//限制注解能注解的范围,比如TYPE,可以注解类,接口;CONSTRUCTOR可以注解构造器
@Retention(RetentionPolicy.SOURCE)//限制注解存在的生命周期,SOURCE(源代码中存在)、CLASS(字节码中存在)、RUNTIME(运行时也存在)
public @interface MyAnnotation {
    String value() default "Hello";//后面跟个default "Hello",意思就是没写String value(),他就默认用Hello

}

上面测试类AnnotationTest输出:

在这里插入图片描述


JUnit单元测试

单元测试大纲

Junit单元测试的使用:

1.需要导入的jar包:
Junit-4.12.jar
hamcrest-core-1.3.jar

2.导入步骤:
见笔记图片步骤


3.创建单元测试类,进行测试
见代码

4.(重点关注)要想能正确的编写单元测试方法,需要满足:
1. 所在的类必须是public的,非抽象的,包含唯一的无参构造器。
2. @Test标记的方法本身必须是public,非抽象的,非静态的,void无返回值,()无参数的。


5.默认情况下,单元测试方法中使用Scanner失效。如何解决?
最上面找到Help——点击Edit Custom VM Options...
——在-javaagent:C:\jetbrains-agent.jar下面加这一句-Deditable.java.test.console=true
然后重启idea就可以输入了。

6.以后写代码会经常写单元测试方法,大家可以将单元测试方法设置为一个模板
怎么设置模板:
File——Settings...(设置)——Editor——Live Templates——点右面的“ + ”——Template Group...(先自己定义个组)
——CustomDefine(用户自定义),OK——在建的组里面再点“ + ”——Live Template——在Abbreviation(希望通过什么可以调出来)中写test
——Description(说明)中写自动生成单元测试方法
——Template text:(模板长什么样子)中写
@Test
public void test$var1$(){   //var变亮
    $var2$
}
最后在下面Define,我们希望在java相关的逻辑中使用,选中Java,OK
  • 测试分类

黑盒测试:不需要写代码,给输入值,看程序是否能够输出期望的值。

白盒测试:需要写代码的。关注程序具体的执行流程。

在这里插入图片描述

在这里插入图片描述

  • JUnit单元测试介绍

JUnit是由Erich Gamma和Kent Beck编写的一个测试框架(regression testing framework),供java开发人员编写单元测试之用。

JUnit测试是程序猿测试,即所谓白盒测试,因为程序员知道被测试时的软件如何(HOW),完成功能和完成什么样(What)的功能。

要使用JUnit,必须在项目的编译路径中引入JUnit的库,即相关的.class文件组成的.jar包。jar就是一个压缩包,压缩包都是开发好的第三方(Oracle公司第一方,我们自己第二方,其他都是第三方)工具类,都是以.class文件形式存在的。
本地包(我也是网上搜索包名下载的)
在这里插入图片描述

  • 引入本地JUnit.jar

(1)在这里插入图片描述

(2)在这里插入图片描述

(3)在这里插入图片描述

(4)在这里插入图片描述

(5)在这里插入图片描述

(6)检查一下Modules——Dependencies下的包是不是Compile。
在这里插入图片描述

(7)查看

在这里插入图片描述

注: 其他模块底下没有导入用到的jar包,怎么能调用且使用@Test单元测试

新建模块

这个模块用来学习单元测试@test不在这个模块底下,怎么添加用起来
1.让导入的jar包让这个模块用起来就能用@Test单元测试
- File——Project Structure...——Modules——选中junit_test——Dependencies——点击右边“ + ”,Library...
- 选中JUnit-libs包-Add selected——把右边Test改成Compile——Apply——Ok

2.在有网的情况下:
- 点到报红@Test那一行,Alt+Enter
- 点击Add "JUnit4'to classpath,然后OK,他就开始有网下载了
package junit_test;

import org.junit.Test;

public class JUnitOutTest {

    @Test
    public void test(){
        System.out.println("Hello");
    }
}

编写和运行@Test单元测试方法

JUnit4版本,要求@Test标记的方法必须满足如下要求:

  1. 所在的类必须是public的,非抽象的,包含唯一的无参构造器。
  2. @Test标记的方法本身必须是public,非抽象的,非静态的,void无返回值,()无参数的。
package oop.demo15_annotation.juint;

import org.junit.Test;

import java.util.Scanner;

public class JunitTest {    //单元测试类
    public static void main(String[] args) {
        JunitTest test = new JunitTest();
        System.out.println(test.number);
        test.method();
    }

    int number = 10;

    //无参构造器
//    public JunitTest() {    //单元测试类只能有一个构造器且是无参构造器,默认就有无参构造,干脆单元测试类直接不写构造器
//    }

    @Test
    public void test1(){    //单元测试方法
        System.out.println("Hello");//Hello
    }

    //可以列很多个单元测试方法
    @Test   //这里只运行这一个模块底下的,不像main方法,如果运行,连上面的,下面的都会运行,或者要把其他的注释了,导入这个包用"@test"单元测试就行了
    public void test2(){
        System.out.println("hello2");//hello2
        System.out.println(number);//10

        method();//输出method()...

        int num = showInfo("China");//China
        System.out.println(num);//1
    }

    public void method(){
        System.out.println("method()...");
    }

    //上面单元测试方法底下调用
    public int showInfo(String info){
        System.out.println(info);
        return 1;
    }

    //默认情况下,单元测试方法中使用Scanner失效,不能输入,解决办法看单元测试大纲
    @Test
    public void test3(){
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入一个数值:");
        int num = scanner.nextInt();
        System.out.println(num);
    }

    //模板里面添加了自动生成单元测试方法,测试一下(怎么添加模板看大纲)
    @Test
    public void test4(){
        System.out.println("Hello");
    }

    @Test
    public void test5(){
        System.out.println("hello,冰默");
    }

}

添加模板:

怎么设置模板:
File——Settings…(设置)——Editor——Live Templates——点右面的“ + ”——Template Group…(先自己定义个组)
——CustomDefine(用户自定义),OK——在建的组里面再点“ + ”——Live Template

——在Abbreviation(希望通过什么可以调出来)中写test
——Description(说明)中写自动生成单元测试方法
——Template text:(模板长什么样子)中写
@Test
public void test v a r 1 var1 var1(){ //var变亮
v a r 2 var2 var2
}
最后在下面Define,我们希望在java相关的逻辑中使用,选中Java,OK

在这里插入图片描述

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

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

相关文章

LeetCode:59. 螺旋矩阵 II

🍎道阻且长,行则将至。🍓 🌻算法,不如说它是一种思考方式🍀 算法专栏: 👉🏻123 一、🌱59. 螺旋矩阵 II 题目描述:给你一个正整数 n &#xff0c…

Python中类属性和类方法

1. 类的结构 1.1 术语 —— 实例 使用面相对象开发,第 1 步 是设计 类使用 类名() 创建对象,创建对象 的动作有两步: (1) 在内存中为对象 分配空间 (2) 调用初始化方法 __init__ 为 对象初始化对象创建后,内存 中就有了一个对象…

【敲敲云】零代码实战,主子表汇总统计—免费的零代码产品

近来很多朋友在使用敲敲云时,不清楚如何使用主子表,及如何在主表中统计子表数据;下面我们就以《订单》表及《订单明细》表来设计一下吧,用到的组件有“设计子表”、“公式”、“汇总”等。 《订单》表展示 总金额 订单明细中“小…

C++ Linux Web Server 面试基础篇-操作系统(三、进程通信)

⭐️我叫忆_恒心,一名喜欢书写博客的在读研究生👨‍🎓。 如果觉得本文能帮到您,麻烦点个赞👍呗! 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧,喜欢的小伙伴给个三连支持一下呗。👍⭐️❤️ Qt5.9专栏定期更新Qt的一些项目Demo 项目与…

恢复调度平台mysql主从同步

修复问题 调度平台两台MySQL从节点存在Slave_SQL_Running异常,需要恢复。 部署步骤 一、先停止调度平台core服务与web服务,否则无法正常锁表 1.1停止调度平台core服务 2.1停止web服务 3.确认MySQL所有执行线程是否都已经停止 show processlist; 如…

小红书流量规则是什么,推荐机制解读

当今的互联网自媒体世界,说到底还是一个流量时代,一个流量为王的时代。不管你在小红书也好,还是其他自媒体平台都需要知晓平台的流量规则。今天和大家分享下小红书流量规则是什么,让我们一起通过流量规则分析小红书机制和算法。 一…

人工智能如何助力建筑设计自动化?

ChatGPT和DALL-E等工具使用大规模机器学习(ML)模型,并访问大量有标记和有意义的数据,以对文本和图像中的查询提供有见解的响应。但是,一些行业对训练ML模型的数据集的访问有限,这使得使用生成式AI来解决现实世界问题的好处很难获得…

书写我的人生回忆录-这应该是给父母最好的礼物

作为一个业余的软件开发爱好者,我又捣鼓了一个有意思的小东西 ,使用完全免费哈 《书写我的人生回忆录》是一款软件,其中包含70个问题,涵盖了父母的个人喜好、家庭、工作、人生经历和态度等方面。通过回答这些问题,您的…

爬虫请求头Content-Length的计算方法

重点:使用node.js 环境计算,同时要让计算的数据通过JSON.stringify从对象变成string。 1. Blob size var str 中国 new Blob([str]).size // 6 2、Buffer.byteLength # node > var str 中国 undefined > Buffer.byteLength(str, utf8) 6 原文…

Spring开启事务流程和事务相关配置

文章目录 Spring事务Spring快速入门事务相关配置 Spring事务 Spring快速入门 事务作用:在数据层保障一系列的数据库操作同成功同失败 Spring事务作用:在数据层或业务层保障一系列的数据库操作同成功同失败 Spring提供了一个接口PlatformTransactionMa…

Vue可视化项目搭建

安装Nodejs 全局下载Vue项目脚手架 创建项目 运行项目 项目初始化 安装Nodejs 下载地址:https://nodejs.org/zh-cn/ 下载完成之后一路点击下一个安装 全局下载Vue项目脚手架 进入开始菜单以管理员身份运行命令提示符 输入更换镜像源为淘宝源 npm config s…

java线程屏障CyclicBarrier

CyclicBarrier允许一组线程在达到一个公共的屏障点时相互等待。它在涉及固定大小的线程组、并且这些线程必须相互等待的程序中非常有用,CyclicBarrier可以在等待的线程被释放后被重用。 构造方法 CyclicBarrier(int parties) 创建一个新的屏障并设置将要访问这个…

问卷调查样本量的确定方法

我们在进行问卷调查的时候,问卷的收集数量是重要的流程之一。问卷数量取决于几个因素,包括研究的目的和研究的类型。接下来,我们就聊一聊怎么确定所需的调查问卷数量。 1、确定研究目标。 确定所需问卷数量的第一步是明确研究目标。这一步是…

jar包依赖冲突该怎么解决(IT枫斗者)

jar包依赖冲突该怎么解决(IT枫斗者) maven jar包依赖规则 间接依赖路径最短优先一个项目依赖了a和b两个jar包,其中a-b-c1.0,d-e-c1.0,由于c1.0路径最短,所以项目最后使用的jar包是c1.0pom文件中申明顺序优先有人就问…

使用三轴XYZ平台绘制空心字

1. 功能说明 本文示例将实现R312三轴XYZ平台绘制“机器时代”空心字的功能。 2. 电子硬件 在这个示例中,采用了以下硬件,请大家参考: 主控板 Basra主控板(兼容Arduino Uno) 扩展板 Bigfish2.1扩展板 SH-ST步进电机扩展…

2023年最系统的自动化测试,测试开发面试题,10k以下不建议看

鉴于现在严峻的就业形势,千万大学生即将出新手村,今天给大家打包好了2023最能避免薪资倒挂的《面试圣经》。不经一番寒彻骨,怎得梅花扑鼻香。这份面试题,与君共勉! 一、开场白 Q:简单自我介绍一下吧 Q:项…

Bots攻击威胁石油石化企业 瑞数动态安全实现从“人防”到“技防”

近日,中国石油石化企业信息技术交流大会暨油气产业数字化转型高峰论坛在京召开。本届大会由中国石油学会、中国石油、中国石化、中国海油、国家管网、国家能源、中国中化、中国航油、延长石油、中国地质调查局等单位共同主办。 作为我国石油石化行业的盛会&#xf…

论坛现场回顾:维视教育的新工科人才培养 「最佳实践 」

全国高校电子信息类专业教学论坛隆重召开 由教育部高等学校电子信息类专业教学指导委员会主办,苏州大学、清华大学出版社承办的“全国高校电子信息类专业教学论坛”于2023年4月14日-16日在江苏省苏州市隆重开幕,维视教育作为电子信息类教学指导委员会战略…

最优化方法Python计算:连续函数的单峰区间计算

我们知道,闭区间上的一元连续函数必在区间上取得最大值和最小值。实践中我们需要能数值地确定含有 f ( x ) f(x) f(x)的唯一最优解 x 0 x_0 x0​的区间 [ a , b ] [a,b] [a,b]。这里介绍寻求连续函数 f ( x ) f(x) f(x)在一点 x ∗ x^* x∗附近单峰区间的包围算法及…

飞桨paddlespeech语音唤醒推理C实现

上篇(飞桨paddlespeech 语音唤醒初探)初探了paddlespeech下的语音唤醒方案,通过调试也搞清楚了里面的细节。因为是python 下的,不能直接部署,要想在嵌入式上部署需要有C下的推理实现,于是我就在C下把这个方…