单元测试反射注解
单元测试
就是针对最小的功能单元(方法),编写测试代码对其进行正确性测试。
咱们之前是如何进行单元测试的?有啥问题 ?
Junit单元测试框架
可以用来对方法进行测试,它是由Junit公司开源出来的
具体步骤
Junit框架的常见注解

public class StringUtilTest {@Test@Beforepublic void testPrintNumber(){StringUtil.printNumber("哈哈");StringUtil.printNumber(null);}@Testpublic void testGetMaxIndex(){int sum = new StringUtil().getMaxIndex("蝙蝠侠不打你了");System.out.println(sum);Assert.assertEquals("警告,警告",6,sum);}@Test@Afterpublic void testPrint(){System.err.println("结束");}
}
反射(Reflection)
反射就是:加载类,并允许以编程的方式解剖类中的各种成分(成员变量、方法、构造器等)。

反射学什么?
获取Class对象的三种方式
1.直接使用类名.class获取:Class c1 = 类名.class
2.调用Class提供的方法:Class c2 = Class.forName("全类名")
3.调用Object提供的方法:Class c3 = 对象.getClass()
public class Demo1 {@Testpublic void testDemo01() throws ClassNotFoundException {Class catClass = Cat.class;System.out.println(catClass.getName());Class aClass = Class.forName("com.itheima.b_反射.Cat");System.out.println(aClass);Class aClass1 = new Cat().getClass();System.out.println(aClass1);}
}
获取类的构造器

/*
获取构造器[下面是Class的方法]Constructor<?>[] getConstructors() 获取所有的公共构造器(只能获取public修饰的)Constructor<?>[] getDeclaredConstructors() 获取全部构造器(只要存在就能拿到)Constructor<T> getConstructor(Class<?>... parameterTypes) 获取某个公共构造器(只能获取public修饰的)Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 获取某个构造器(只要存在就能拿到)使用构造器(创建对象)[下面是Constructor的方法]T newInstance(Object... initArgs) 调用此构造器对象表示的构造器,并传入参数,完成对象的初始化并返回public void setAccessible(boolean flag) 设置为true,表示禁止检查访问控制(暴力反射)注意使如果想使用private修饰构造器反射创建对象,需要暴力反射(禁止JVM检查构造方法的访问权限)
*/
public class Demo2 {@Testpublic void testConstructor() throws NoSuchMethodException {Class<Cat> clazz = Cat.class;//获取全部构造器(public)Constructor[] constructors = clazz.getConstructors();for (Constructor constructor : constructors) {System.out.println(constructor);}Constructor<?>[] declaredConstructors = clazz.getDeclaredConstructors();for (Constructor<?> declaredConstructor : declaredConstructors) {System.out.println(declaredConstructor);}System.out.println("====================================");Constructor<Cat> constructor = clazz.getConstructor();System.out.println(constructor);System.out.println("===============================");Constructor<Cat> declaredConstructor = clazz.getDeclaredConstructor(String.class, int.class);System.out.println("方法名:" + declaredConstructor.getName() + "参数个数:"+ declaredConstructor.getParameterCount());}@Testpublic void testNew() throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {Class calazz = Cat.class;Constructor declaredConstructor = calazz.getDeclaredConstructor(String.class, int.class);declaredConstructor.setAccessible(true);Cat 加菲猫 = (Cat)declaredConstructor.newInstance("加菲猫", 3);System.out.println(加菲猫);}
}
获取类的成员变量

public class Demo3 {@Testpublic void testField() throws NoSuchFieldException {Class<Cat> catClass = Cat.class;//获取类的所有公共成员变量(只能获取public修饰的)Field[] fields = catClass.getFields();for (Field field : fields) {System.out.println(field);}System.out.println("===============");//获取类的全部成员变量Field[] declaredFields = catClass.getDeclaredFields();for (Field declaredField : declaredFields) {System.out.println(declaredField.getName() + declaredField.getType());}System.out.println("====================");Field a = catClass.getField("a");//获取某个类的成员变量,只要存在就能拿到System.out.println(a);Field age = catClass.getDeclaredField("age");System.out.println(age);}@Testpublic void test2() throws NoSuchFieldException, IllegalAccessException {Class clazz = Cat.class;Cat cat = new Cat();// System.out.println(cat);Field age = clazz.getDeclaredField("age");Field name = clazz.getDeclaredField("name");//暴力反射age.setAccessible(true);name.setAccessible(true);age.set(cat,5);name.set(cat,"哈哈");System.out.println(cat);//取值Object o = age.get(cat);System.out.println(o);}
}
获取类的成员方法

/*
获取成员方法[Class提供]Method[] getMethods() 获取类的全部公共成员方法(只能获取public修饰的)Method[] getDeclaredMethods() 获取类的全部成员方法(只要存在就能拿到)Method getMethod(String name, Class<?>... parameterTypes) 获取类的某个公共成员方法(只能获取public修饰的)Method getDeclaredMethod(String name, Class<?>... parameterTypes) 获取类的某个成员方法(只要存在就能拿到)使用成员方法(执行方法)[Method提供]public Object invoke(Object obj, Object... args) 触发某个对象的该方法执行。public void setAccessible(boolean flag) 设置为true,表示禁止检查访问控制(暴力反射)注意使如果想使用private修饰的成员方法,需要暴力反射
*/
public class Demo4 {@Testpublic void testMethods() throws NoSuchMethodException {Class<Cat> catClass = Cat.class;Method[] methods = catClass.getMethods();for (Method method : methods) {System.out.println("方法名:"+ method.getName() + "返回值类型:" + method.getReturnType());}System.out.println("===========================");Method[] declaredMethods = catClass.getDeclaredMethods();for (Method declaredMethod : declaredMethods) {System.out.println("方法名:"+ declaredMethod.getName() + "返回值类型" + declaredMethod.getReturnType());}System.out.println("===========================");Method eat = catClass.getDeclaredMethod("eat");System.out.println("方法名:"+ eat.getName() + "返回值类型" + eat.getReturnType());System.out.println("===========================");Method eat1 = catClass.getDeclaredMethod("eat", String.class);System.out.println("方法名:"+ eat1.getName() + "返回值类型" + eat1.getReturnType());}@Testpublic void tese2() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {Class<Cat> clazz = Cat.class;Method eat = clazz.getDeclaredMethod("eat", String.class);eat.setAccessible(true);Cat cat = new Cat();Object invoke = eat.invoke(cat, "🐟");System.out.println(invoke);}
}
案例:
/*
反射案例对于任意一个对象,该框架都可以把对象的字段名和对应的值,然后打印在控制台*/
public class Demo5 {public static void main(String[] args) {//1. 准备两个对象Student student = new Student("柳岩", 40, '女', 167.5, "女星");Teacher teacher = new Teacher("播妞", 6000);//2.调用方法print(student);}public static void print(Object o) {try {Class clazz = o.getClass();Field[] declaredFields = clazz.getDeclaredFields();for (Field declaredField : declaredFields) {declaredField.setAccessible(true);String name = declaredField.getName();Object o1 = declaredField.get(o);System.out.println(name+o1);}}catch (Exception e){}}
}class Student{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;}private String name;private int age;private char sex;private double height;private String hobby;
}class Teacher {public Teacher(String name, double salary) {this.name = name;this.salary = salary;}private String name;private double salary;
}
反射的作用
注解
元注解
指的是:修饰注解的注解。
注解解析器
就是判断类上、方法上、成员变量上是否存在注解,并把注解里的内容给解析出来。
如何解析注解
public class ClassNameCheckParser {public static void checkClassName(){//1.存放不符合规范的类ArrayList<String> list = new ArrayList<>();//2.获取指定包下的所有类Set<Class> clazzSet = ClassUtil.getClasses("com.itheima.c_annotation.example");//3.遍历set集合找到标注@ClassNameCheck注解的类'for (Class clazz : clazzSet) {//判断某个类上是否有某个注解if(clazz.isAnnotationPresent(ClassNameCheck.class)){//获得类名String simpleName = clazz.getSimpleName();//检查类名是否以Heima开头if(!simpleName.startsWith("Hei")){list.add(simpleName);}}}//判断集合中是否有不符合规范的,如果有直接保存if(list.size() > 0) {System.out.println("下面类名不符合规范");for (String name : list) {System.out.println(name);}throw new RuntimeException("程序终止");}}}相关文章:
单元测试反射注解
单元测试 就是针对最小的功能单元(方法),编写测试代码对其进行正确性测试。 咱们之前是如何进行单元测试的?有啥问题 ? Junit单元测试框架 可以用来对方法进行测试,它是由Junit公司开源出来的 具体步骤 Junit框架的常见注解…...
Android 交叉编译openssl 、libxml2静态库
openssl: Android下openssl编译和使用(一)_安卓编译openssl 交叉编译 for arch in armeabi-v7a arm64-v8a-CSDN博客 libxml2: LIBXML2 2.9.11 build for Android_libxml2 android静态库_fredhurui的博客-CSDN博客...
神经网络气温预测
#引用所需要的库 import numpy as np import pandas as pd import matplotlib.pyplot as plt import torch import torch.optim as optim#优化器 #过滤警告 import warnings warnings.filterwarnings(“ignore”) %matplotlib inline featurespd.read_csv(‘temps.csv’) feat…...
体验SOLIDWORKS钣金切口工具增强 硕迪科技
在工业生产制造中,钣金加工是一种常用的加工方式,在SOLIDWORKS2024新版本中,钣金切口工具再次增强了,从SOLIDWORKS 2024 开始, 您可以使用切口工具在空心或薄壁圆柱体和圆锥体中生成切口。 只需在现有空心或薄壁圆柱体…...
(八)Flask之app.route装饰器函数的参数
app.route参数 app.route()是Flask框架中用于定义路由的装饰器函数,它接受一些参数来指定路由的URL规则、请求方法等。 app.route()参数如下: rule(必选):定义URL规则的字符串,表示要匹配的URL路径。可以…...
ES6.8集群配置注意点
x-pack配置 当启用xpack.security.enabled时,确保集群中的所有节点都配置了此项,并确保所有节点都已重启。如果只有部分节点启用安全性,那么集群可能会遇到问题。 设置密码 使用elasticsearch-setup-passwords工具设置密码时,确保…...
Powercli批量修改分布式交换机端口组
背景 需求: 批量修改虚拟机的分布式端口组 解决方式一: 三条命令解决:先获取目标虚拟机、获取目标端口组、修改虚拟机端口组、检查虚拟机状态。 $vm Get-VM -Name <虚拟机名称> $portGroup Get-VirtualPortGroup -Name <端口…...
ZKP10.2 Efficient Recursion via Statement Folding (Nova)
ZKP学习笔记 ZK-Learning MOOC课程笔记 Lecture 10: Recursive SNARKs, Aggregation and Accumulation (Dan Boneh) 10.3 Efficient Recursion via Statement Folding: Nova, Supernova, and generalizations The difficulty with full recursion Prover P needs to build a…...
高浓度cod废水怎么处理
高浓度COD废水的处理方法主要有物理法、生物法和化学法。 物理法:一般通过加入絮凝剂,利用絮凝剂的吸附、电中和等作用将水中的颗粒物结团沉降下去,从而达到去除部分来自颗粒物的COD。此方法基本上只对浓度上万、上千的COD起作用,…...
Docker学习——②
文章目录 1、Docker是什么1.1 Docker本质1.2 Docker的引擎迭代1.3 Docker和虚拟机的区别1.4 Docker 为什么比虚拟机资源利用率高,启动快?1.5 Docker 和 JVM 虚拟化的区别? 2、Docker架构3、Docker生态3.1 新时代软件诉求3.2 Docker 解决方案 …...
VSCode 设置平滑光标
1.点击左下角的设置按钮,再点击设置 2.点击文本编辑器,点击光标,勾选控制是否启用平滑插入动画。 3.随便打开一个文件,上下左右移动光标时,会发现非常的流畅。 原创作者:吴小糖 创作时间:2023…...
Spring、SpringMVC、Mybatis
一.Spring基础 1.Spring 框架是什么 Spring 是一款开源的轻量级 Java 开发框架,我们一般说 Spring 框架指的都是 Spring Framework,它是很多模块的集合,例如,Spring core、Spring JDBC、Spring MVC 等,使用这些模块可…...
Kubernetes 架构
Kubernetes 架构 Kubernetes 最初源于谷歌内部的 Borg,提供了面向应用的容器集群部署和管理系统。Kubernetes 的目标旨在消除编排物理 / 虚拟计算,网络和存储基础设施的负担,并使应用程序运营商和开发人员完全将重点放在以容器为中心的原语上进行自助运营。Kubernetes 也提…...
python---数据类型(列表)
组织列表 使用sort()方法对列表永久性排序 按照字母顺序排序: motorcycles [chunlan, yamaha, dayun, jianshe]motorcycles.sort()print(motorcycles) 字母倒序: motorcycles [chunlan, yamaha, dayun, jianshe]motorcycles.sort(reverseTrue)pri…...
CentOS 7升级gcc/G++版本
Centos 7默认gcc版本为4.8,有时需要更高版本,只需要执行几条命令,无需下载源码编译编译。 安装centos-release-scl sudo yum install centos-release-scl 安装devtoolset sudo yum install devtoolset-8-gcc* 注意,如果想安装…...
uni-app开发微信公众号 H5打开扫一扫功能
<!--引入微信sdk--> <script src"http://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>let url location.href.split(#)[0];newApi.getSignature({ url }).then(res > {if (res.code 0) {this.sdk.config({beta: true, // 必须这么写&a…...
k8s-服务网格实战-入门Istio
istio-01.png 背景 终于进入大家都比较感兴趣的服务网格系列了,在前面已经讲解了: 如何部署应用到 kubernetes服务之间如何调用如何通过域名访问我们的服务如何使用 kubernetes 自带的配置 ConfigMap 基本上已经够我们开发一般规模的 web 应用了…...
金属压铸件自动化3D全尺寸测量设备自动外观检测三维检测-CASAIM
铸造作为现代装备制造工业的基础共性技术之一,铸件产品既是工业制造产品,也是大型机械的重要组成部分,被广泛运用在航空航天、工业船舶、机械电子和交通运输等行业。 铸件形状复杂,一般的三坐标或者卡尺圆规等工具难以获取多特征…...
Android笔记(十):结合Navigation组件实现Compose界面的导航
在Android笔记(七)搭建Android JetPack Compose组件中Scaffold脚手架 一文中通过定义一个导航的函数来实现不同界面的切换。如果没有传递任何参数,这样的导航处理也是可以接受的,处理方式也非常简单。但是,如果考虑到不…...
linux内核tcp配置--断网后连接卡住
通过隐藏通信应用程序中的临时网络中断,TCP 可以在偶尔不可靠的网络上提供可靠的通信。在通知发件人任何问题之前,您的操作系统将多次重发丢失的消息。大多数 Linux 发行版默认将任何丢失的数据包重传 15 次。重新传输以指数方式回退,因此这 …...
Hyperf 高并发的庖丁解牛
它的本质是:**Hyperf 的高并发并非来自 PHP 语言本身的计算速度,而是来自对 I/O 等待时间 (I/O Wait Time) 的极致利用。它通过 Swoole/Swow 扩展 将传统的 同步阻塞 (Sync-Blocking) 模式转变为 异步非阻塞 (Async-Non-blocking) 模式,并利用…...
Swift底层多线程:POSIX线程封装与安全并发实践
1. 项目概述:当Swift遇见POSIX线程如果你在Swift里用过DispatchQueue或者Thread,有没有想过它们背后到底是怎么运作的?特别是当你的应用需要处理高并发、低延迟的任务,或者需要在Linux服务器上跑一个Swift后端服务时,仅…...
PEMS交通数据实战:用Python从原始TXT到可视化分析的完整Pipeline
PEMS交通数据实战:用Python构建端到端分析管道的深度指南 当清晨第一缕阳光洒在加州高速公路上,数以万计的感应器已经开始悄无声息地记录着每辆车的轨迹。这些来自PEMS(Performance Measurement System)的海量数据,正等待着被转化为改善城市交…...
告别枯燥例程:用STM32F4的CAN总线做个简易‘聊天室’(附代码)
用STM32F4的CAN总线打造趣味聊天室:从零实现双向文本通信 当两块STM32开发板通过CAN总线互相发送"Hello World"时,LED灯闪烁的瞬间往往比教科书上的协议框图更让人记忆深刻。这个项目将带您用两片价值不到百元的STM32F4开发板(或一…...
2026实测:如何把知网论文AI率从90%降到4%?(手把手教你降AI)
一份知网AIGC检测报告摆在面前:疑似度84.9%。几乎整篇论文都被标红,系统判定其中84.9%的内容"疑似AI生成"。这个数字意味着什么?意味着在任何一所高校的标准下,这篇论文都不可能通过审查。 然而同一篇论文经过处理后再次…...
14.3 异步协程开发铁律示例 与 标准示例代码核心:事件循环内严禁编写同步逻辑,协程业务务必全程异步
Python异步协程从原理到实战完整总结 一、协程底层核心 asyncio 基于单线程事件循环驱动运行,通过 await 主动让出执行权完成任务切换,切换开销远低于多线程,天生适配IO密集型业务场景; 单线程特性决定它无法直接利用多核处理CPU密…...
中间件简单题目教学
题目1:环境搭建与简单模式使用 Docker 启动 RabbitMQ 4.x 容器,用户 guest,密码 123456,映射管理端口 15672。编写 Java 原生生产者,向队列 test_queue 发送消息 "Hello Exam"。编写 Java 原生消费者&#x…...
告别抓包焦虑:Win10下搞定8812BU网卡驱动与Omnipeek联动的保姆级避坑指南
告别抓包焦虑:Win10下搞定8812BU网卡驱动与Omnipeek联动的保姆级避坑指南 在无线网络分析领域,8812BU芯片的无线网卡因其出色的抓包能力备受青睐,但许多用户在Windows 10环境下配置驱动与Omnipeek抓包工具时,往往会陷入驱动安装失…...
论文重复率过低该怎么办?
很多人第一次看到“论文重复率过低”会慌,觉得是不是“太低反而有问题”。先说结论:单纯“重复率低”本身通常不是问题,关键看你低到什么程度,以及你的论文内容是否合理。常见情况分这几种:1. 10%以下:很正…...
实习前自我培训-Day3学习
Day3学习–MySQL 企业开发使用方式 使用命令mysql -hip地址 -P端口号 -uroot -p来连接远程的数据库 数据模型关系型数据库:建立在关系模型基础上,由多张相互连接的二维表组成的数据库特点:使用表存储数据,格式同意,便于…...
