单元测试反射注解
单元测试
就是针对最小的功能单元(方法),编写测试代码对其进行正确性测试。
咱们之前是如何进行单元测试的?有啥问题 ?
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 次。重新传输以指数方式回退,因此这 …...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...

Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...

如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...

Qemu arm操作系统开发环境
使用qemu虚拟arm硬件比较合适。 步骤如下: 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载,下载地址:https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...
Python 高效图像帧提取与视频编码:实战指南
Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...

【堆垛策略】设计方法
堆垛策略的设计是积木堆叠系统的核心,直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法,涵盖基础规则、优化算法和容错机制: 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则: 大尺寸/重量积木在下…...
Python网页自动化Selenium中文文档
1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API,让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API,你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...

【若依】框架项目部署笔记
参考【SpringBoot】【Vue】项目部署_no main manifest attribute, in springboot-0.0.1-sn-CSDN博客 多一个redis安装 准备工作: 压缩包下载:http://download.redis.io/releases 1. 上传压缩包,并进入压缩包所在目录,解压到目标…...

麒麟系统使用-进行.NET开发
文章目录 前言一、搭建dotnet环境1.获取相关资源2.配置dotnet 二、使用dotnet三、其他说明总结 前言 麒麟系统的内核是基于linux的,如果需要进行.NET开发,则需要安装特定的应用。由于NET Framework 是仅适用于 Windows 版本的 .NET,所以要进…...