06_单元测试与反射

单元测试

什么是单元测试
  • 就是针对最小的功能单位(方法),编写测试代码对其进行正确性测试
  • Junit 单元测试框架:可以用来对方法进行测试,它是第三方公司开源出来的(IDEA 以及集成了此框架)
注解说明
@Test测试类中的方法必须用它修饰才能成为测试方法,才能启动执行
@Before用来修饰一个实例方法,该方法会在每一个测试方法执行之前执行一次
@After用来修饰一个实例方法,该方法会在每一个测试方法执行之后执行一次
@BeforeClass用来修饰一个静态方法,该方法会在所有测试方法之前只执行一次
@AfterClass用来修饰一个静态方法,该方法会在所有测试方法之后只执行一次
  • 在测试方法执行前执行的方法,常用于:初始化资源
  • 在测试方法执行完后再执行的方法,常用于:释放资源
// 被测试的方法/*** 字符串工具类*/
public class StringUtil {public static void printNumber(String name) {if (name == null) {System.out.println(0);return;// 停掉方法}System.out.println("名字的长度是:" + name.length());}// 求字符串最大索引public static int getMaxIndex(String data) {if (data == null) {return -1;}return data.length();}}
// 进行测试的类import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;/*** 测试类* 测试方法必须做到:公共、无参、无返回值* 测试方法上面必须声明 @Test 注解*/public class StringUtilTest {@Beforepublic void test1() {System.out.println("------test1执行了------");}@Testpublic void testPrintNumber() {StringUtil.printNumber(null);}@Testpublic void testGetMaxIndex() {int index1 = StringUtil.getMaxIndex(null);System.out.println(index1);int index2 = StringUtil.getMaxIndex("admin");System.out.println(index2);// 断言机制:程序员可以通过预测业务方法的结果Assert.assertEquals("方法内部有bug!", 4, index2);}
}

反射

认识反射

反射就是:加载类,并允许以编程的方式解剖类中的各种成分(成员变量、方法、构造器)

获取类
public class Test {public static void main(String[] args) throws Exception {// 获取Class对象的三种方式// 方式一Class c1 = Student.class;// 获取类的名字// 获取全类名  【全类名 = 包名.类的简名】System.out.println(c1.getName());  // login.Student ()// 获取类的简名System.out.println(c1.getSimpleName());  // Student// 方式二Class c2 = Class.forName("login.Student");System.out.println(c2 == c1);  // true// 方式三Student s = new Student();Class c3 = s.getClass();System.out.println(c3 == c2);  // true}
}class Student {private String name;private int age;
}
获取类的构造器
// Cat 类 (前置资源)public class Cat {private String name;private int age;public Cat() {}public Cat(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}
// 第一部分展示import java.lang.reflect.Constructor;public class Test {public static void main(String[] args) throws Exception {// 1. 反射第一步:必须先得到这个类的 Class 对象Class c = Cat.class;// 2. 获取类的全部构造器// Constructor[] constructors = c.getConstructors();  // getConstructors 功能当构造器为私有时,获取不到Constructor[] constructors = c.getDeclaredConstructors();  // 不管是否私有,都能拿到全部的构造器// 3. 遍历数组中的每个构造器对象for (Constructor constructor : constructors) {System.out.println(constructor.getName() + "--->" +constructor.getParameterCount());}/** 运行结果:**       login.Cat--->0*       login.Cat--->2* * */}
}
// 第二部分展示import java.lang.reflect.Constructor;public class Test {public static void main(String[] args) throws Exception {// 1. 反射第一步:必须先得到这个类的 Class 对象Class c = Cat.class;// 2. 获取某个构造器:无参构造器Constructor constructor = c.getConstructor();System.out.println(constructor.getName() + "--->" +constructor.getParameterCount());  // login.Cat--->0// 3. 获取有参构造器Constructor constructor1 = c.getConstructor(String.class, int.class);System.out.println(constructor1.getName() + "--->" +constructor1.getParameterCount());  // login.Cat--->2}
}

获取类的构造器,有什么用吗?

获取类的构造器的作用,依然是初始化一个对象返回(这种初始化,可以实现暴力破解构造器中 private 的限制)

// Cat 类 (前置资源)class Cat {private String name;private int age;// 重写了 toString 方法!@Overridepublic String toString() {return "Cat{" +"name='" + name + '\'' +", age=" + age +'}';}public Cat() {}public Cat(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}
import java.lang.reflect.Constructor;public class Test {public static void main(String[] args) throws Exception {// 1. 反射第一步:必须先得到这个类的 Class 对象Class c = Cat.class;// 2. 获取某个构造器:无参构造器Constructor constructor = c.getConstructor();System.out.println(constructor.getName() + "--->" +constructor.getParameterCount());  // login.Cat--->0// ---访问无参构造器的成员变量constructor.setAccessible(true);  // 当输入了这一句代码,意味着// 开启了"禁止检查访问权限"功能,即使构造器是私有的,也能实现访问成员变量,这个是暴力反射!Cat cat = (Cat) constructor.newInstance();System.out.println(cat);  // Cat{name='null', age=0}// 3. 获取有参构造器Constructor constructor1 = c.getConstructor(String.class, int.class);System.out.println(constructor1.getName() + "--->" +constructor1.getParameterCount());  // login.Cat--->2// ---访问有参构造器的成员变量Cat cat1 = (Cat) constructor1.newInstance("叮当猫", 3);System.out.println(cat1);  // Cat{name='null', age=0}}
}
获取类的成员变量
// Cat 类 (前置资源)public class Cat {public static final String COUNTRY = "中国";public static int a;private String name;private int age;@Overridepublic String toString() {return "Cat{" +"name='" + name + '\'' +", age=" + age +'}';}public Cat() {}public Cat(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}
import java.lang.reflect.Field;public class Test {public static void main(String[] args) throws Exception {// 1. 反射第一步:必须是先得到类的 Class 对象Class c = Cat.class;// 2. 获取类的全部成员变量Field[] fields = c.getDeclaredFields();// 3. 遍历这个成员变量数组for (Field field : fields) {System.out.println(field.getName() + "--->" + field.getType());}System.out.println("----------------------------");// 4. 定位到某个成员变量Field fName = c.getDeclaredField("name");System.out.println(fName.getName() + "--->" + fName.getType());Field fAge = c.getDeclaredField("age");System.out.println(fAge.getName() + "--->" + fAge.getType());// 运行结果:/*COUNTRY--->class java.lang.Stringa--->intname--->class java.lang.Stringage--->int----------------------------name--->class java.lang.Stringage--->int*/}
}

获取成员变量的作用:依然是赋值、取值

import java.lang.reflect.Field;public class Test {public static void main(String[] args) throws Exception {// 得到类的 Class 对象Class c = Cat.class;// 定位到某个成员变量Field fName = c.getDeclaredField("name");Field fAge = c.getDeclaredField("age");// 进行赋值Cat cat = new Cat();fName.setAccessible(true);  // 禁止访问控制权限fName.set(cat, "咖啡猫");System.out.println(cat);  // Cat{name='咖啡猫', age=0}// 进行取值String name = (String) fName.get(cat);System.out.println(name);  // 咖啡猫}
}
获取类的成员方法
import java.lang.reflect.Method;public class Test {public static void main(String[] args) throws Exception {// 1. 得到类的 Class 对象Class c = Cat.class;// 2. 获取类的全部成员方法Method[] methods = c.getDeclaredMethods();// 3. 遍历数组中的每个方法对象for (Method method : methods) {System.out.println(method.getName() + "--->"+ method.getParameterCount() + "--->"+ method.getReturnType());}System.out.println("-----------------------");// 4. 获取某个方法对象Method run = c.getDeclaredMethod("run");  // 拿run方法,无参数的System.out.println(run.getName() + "--->"+ run.getParameterCount() + "--->"+ run.getReturnType());System.out.println("-----------------------");Method eat = c.getDeclaredMethod("eat", String.class);  // 拿eat方法,含参数的System.out.println(eat.getName() + "--->"+ eat.getParameterCount() + "--->"+ eat.getReturnType());// 5. 获取成员方法的作用:依然是执行Cat cat = new Cat();  // 先创造一个成员出来,才能执行成员方法run.setAccessible(true);  // 禁止检查访问权限 (暴力解除了 private 的限制)Object res1 = run.invoke(cat);System.out.println(res1);eat.setAccessible(true);  // 禁止检查访问权限 (暴力解除了 private 的限制)Object res2 = eat.invoke(cat, "鱼");System.out.println(res2);// 运行结果/*eat--->1--->class java.lang.StringgetAge--->0--->intsetAge--->1--->voidgetName--->0--->class java.lang.Stringrun--->0--->voidtoString--->0--->class java.lang.StringsetName--->1--->void-----------------------run--->0--->void-----------------------eat--->1--->class java.lang.String猫跑得快null猫最爱吃:鱼*/}
}
应用场景
  • 基本作用:可以得到一个类的全部成分然后操作
  • 可以破坏封装性
  • 最重要的用途是:适合做 Java 的框架,基本上,主流的框架都会基于反射设计出一些通用的功能

案例:要求对于任意一个对象,该框架都可以把对象的字段名和对应的值,保存到文件中去

// 运行程序部分public class Test {public static void main(String[] args) throws Exception {Student s1 = new Student("Jack", 29, '男', 168, "唱歌");Teacher t1 = new Teacher("Tony", 9000);// 需求:要求对于任意一个对象,该框架都可以把对象的字段名和对应的值,保存到文件中去String PATH = "E:/Desktop/temp.txt";System.out.println(ObjectFrame.savaObject(s1, PATH));System.out.println(ObjectFrame.savaObject(t1, PATH));}
}class Student {private String name;private int age;private char sex;private double height;private String hobby;public Student(String name, int age, char sex, double height, String hobby) {this.name = name;this.age = age;this.sex = sex;this.height = height;this.hobby = hobby;}
}class Teacher {private String name;private double salary;public Teacher(String name, double salary) {this.name = name;this.salary = salary;}
}
// 框架部分import java.io.FileOutputStream;
import java.io.PrintStream;
import java.lang.reflect.Field;public class ObjectFrame {// 目的:可以保存任何对象的字段和其数据到文件中去public static boolean savaObject(Object obj, String path) throws Exception {// 创建打印输出流,待会保存数据到文件要用PrintStream ps = new PrintStream(new FileOutputStream(path, true));  // true 代表开启追加模式// obj 是任意对象,不清楚到达有多少个字段要保存Class c = obj.getClass();  // 通过对象拿到它的"类对象"String cName = c.getSimpleName();  // 通过"类对象"获取类的简单名ps.println("----------" + cName + "----------");// 从这个类中提取它的全部成员变量Field[] fields = c.getDeclaredFields();// 遍历,得到并操作每个成员对象for (Field field : fields) {String name = field.getName();  // 拿到该成员变量的名字field.setAccessible(true);  // 禁止检查访问权限 (通过暴力手段解除了 private 的限制)String value = field.get(obj) + "";  // 拿到对象在"该成员变量"中存的值ps.println(name + "=" + value);  // 将数据输出到文件中}ps.close();return true;}
}
// 路径"E:/Desktop/temp.txt"的文件内容----------Student----------
name=Jack
age=29
sex=男
height=168.0
hobby=唱歌
----------Teacher----------
name=Tony
salary=9000.0

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

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

相关文章

c语言指针详解(上)

目录 一、指针的基本概念和用法 二、指针运算 2.1 指针的自增和自减运算 2.2 指针的自增和自减运算 三、数组和指针 四、指针和函数 4.1 在函数中使用指针作为参数和返回值 4.1.1 使用指针作为函数参数 4.1.2 使用指针作为函数返回值 4.2 指针参数的传值和传引用特性 4.2.1 指针…

SIT75176B:3.0~5.5V 供电,32 节点,10Mbps 半双工 RS485/RS422 收发器

SIT75176B 是一款 3.0V~5.5V 电源供电、总线端口 ESD 保护能力 HBM 达到 15kV 以上、总 线耐压范围达到 15V 、半双工、低功耗,功能完全满足 TIA/EIA-485 标准要求的 RS-485 收发器, 最多允许 32 个节点同时连接到总线。 SIT75176B 包…

嵌入式软开 23秋招时间线 以及一些没用的记录碎碎念

0711 百度 嵌入式深度学习研发工程 0808 简历共享[ ] 0717 西安紫光国芯 二院二十三所 西安咸阳 中兵202 0718 字节 海信 乐鑫 燧原科技 建立挂 格力 投的晚 没消息 兆易创新 0801 y一面 0807 人才库 联想 提前批做过测评,没笔试没感谢信 科大讯飞 非凡计划寄…

使用 async/await 是必须避免的陷阱

使用 async/await 是必须避免的陷阱 如果我们使用过 nodejs,那么我们可能已经在 javaSoript 中使用了异步操作。异步任务是一个独立于 JavaSoript 引擎的主线程执行的操作。从本质上讲,这就是应用程序功能没有阻塞的 UI 的原因。 nodejs 的单线程性质&a…

DeepStream系列之rtmpsink功能,rtsp转rtmp,opencv读取rtsp图像处理后推流rtmp

了解到一个更好的流媒体开源项目,是中国人写的,项目地址 https://github.com/ossrs/srs,有兴趣的可以尝试下,实时性更快 DeepStream系列之rtmpsink功能 实时性没要求,可以用下面的opencv opencv读取rtsp图像处理后推流…

如何快速看懂市场行情?

一、看大盘指数 咱们平时所说的大盘其实指的就是上证指数,它是整个市场的晴雨表。大盘涨了,个股跟着上涨的概率就大,大盘跌了,个股被拖累下跌的概率也大。所以,要想在股市中尝到甜头,大盘分析是少不了滴&am…

python socket编程7 - 使用PyQt6 开发UI界面新增实现UDP server和client单机通讯的例子

在第五篇中,简单实现了命令行下的 TCP/UDP server和client的单机通讯。 在第六篇中,实现了PyQt6开发界面,TCP协议实现的单机server和client的通讯功能。 这一篇,在第六篇的基础上,增加了UDP server和client的单机通讯功…

【在英伟达nvidia的jetson-orin-nx上使用调试摄像头-同时开启多个摄像头-基础测试(2)】

【在英伟达nvidia的jetson-orin-nx上使用调试摄像头-同时开启多个摄像头-USB摄像头与Camera Conn.#0/#1接口-基础测试(2)】 1、概述2、实验环境3、 先前确认(1)USB摄像头,先确认可以单独打开(2)…

灯塔ARL-NPoC全面教程

灯塔ARL-NPoC全面教程 1.ARL-NPoC2.安装3.参数解析4.ARL-NPoC编写指南标准POC模板`__init()__`verifyexploit_cmd5.将指纹同步到远程Web服务器1.ARL-NPoC 最新版的arl增加了poc编写与探测的功能,ARL-NPoC是一个集漏洞验证和任务运行的一个框架 2.安装 ARL-NPoC下载地址 下载…

Leetcode题库(数据库合集)_ 难度:困难

目录 难度:困难1. 部门工资前三高的所有员工2. 行程和用户3. 体育馆的人流量4. 员工薪水的中位数5. 同一天的第一个电话和最后一个电话6. 查询员工的累计薪水7. 给定数字的频率查询中位数8. 学生地理信息报告9. Hopper 公司查询 ①10. 职员招聘人数11. 职员招聘人数…

MPC模型预测控制理论与实践

一、基本概念 最有控制的动机是在约束条件下达到最优的系统表现。 模型预测控制(MPC,Model Predictive Control)是通过模型来预测系统在某一未来时间段内的表现来进行优化控制,多用于数位控制,通常用离散型状态空间表…

我的计算机之旅:为何选择这个领域?

🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot 🌺 仓库主页: Gitee 💫 Github 💫 GitCode 💖 欢迎点赞…

python 堆与栈

【一】堆与栈 【 1 】简介 栈(stack),有些地方称为堆栈,是一种容器,可存入数据元素、访问元素、删除元素,它的特点在于只能允许在容器的一端(称为栈顶端指标,英语:top&a…

企业微信SCRM助力,让运营效率翻倍!

如今,越来越多的企业选择通过企业微信进行营销,将客户引入企业微信并沉淀到社群中进行精细化运营。相较于个人微信,企业微信的功能更加丰富,更适合企业进行私域留存。 然而,企业微信自带的功能往往只能满足企业的基本…

CSS中常用的4种长度单位

在现实生活中,我们知道很多的长度单位,例如米,厘米,寸,尺等等,在css的世界中,也有很多的长度单位 以下是css中常用的四种常用的长度单位 1,像素 px - 像素是我们在网页中使用的最…

IPoIB在国产并行系统上的实现与优化

目录 1 国产异构众核系统 2 相关工作 3 IPoIB在国产并行系统上的实现 3.1 IPoIB协议原理

Java_ArrayList顺序表详解

目录 前言 顺序表 ​编辑 顺序表和数组 ArrayList简介 说明 ArrayList使用​编辑 ArrayList常见操作 ArrayList实现二维数组 ArrayList的遍历 ArrayList的扩容机制 总结 前言 一个高端的程序员,往往都是数据结构学的很好,判断一个程序的优劣也是看数据结构学的好与坏.…

原生video设置控制面板controls显示哪些控件

之前我们学习了如何使用原生video播放视频 今天来一个进阶版的——设置控制面板controls显示哪些控件 先看一下当我们使用原生video时,controls属性为true时,相关代码如下: 正常的控制面板默认显示的控件有:播放、时间线、音量调…

CloudStack中的VPC(Virtual Private Cloud)

CloudStack中的VPC(Virtual Private Cloud,虚拟私有云)是一种网络隔离和管理机制,允许用户在云环境中创建独立的虚拟网络环境。VPC提供了逻辑上隔离的网络空间,可用于创建虚拟机、子网、路由器和防火墙等网络资源&…

【ffmpeg】视频常用操作合集

1.转码264 ffmpeg -i [原视频.mp4] -vcodec h264 [输出视频.mp4]2.视频流yuv数据抽取帧 ffmpeg -f rawvideo -s:v [尺寸] -i "[视频源]" -f image2 -q 2 -r [帧数] [文件夹及文件名]尺寸 : 例如 :640x360 视频源:例如&#xff1a…