单元测试反射注解

单元测试

         就是针对最小的功能单元(方法),编写测试代码对其进行正确性测试。

咱们之前是如何进行单元测试的?有啥问题 ? 

 

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("程序终止");}}}

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

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

相关文章

『亚马逊云科技产品测评』活动征文|占了个便宜,12个月的免费云服务器

授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 在群里看到有小伙伴说亚马逊可以免费试用服务器&#xff0c;这种好事不得…

Jenkins自动化部署简单配置

下载安装jenkins 安装Jenkins步骤 点击Next的时候会有jdk版本跟Jenkins版本不符合的情况 1. 看下任务管理器内Jenkins服务是否启动&#xff0c;在浏览器里面输入localhost:2023&#xff08;端口号是安装时输入的&#xff09; 2. 根据路径找到放置密码的文件&#xff08;C…

Yolov8改进CoTAttention注意力机制,效果秒杀CBAM、SE

1.CoTAttention 论文地址&#xff1a;2107.12292.pdf (arxiv.org) CoTAttention网络是一种用于多模态场景下的视觉问答&#xff08;Visual Question Answering&#xff0c;VQA&#xff09;任务的神经网络模型。它是在经典的注意力机制&#xff08;Attention Mechanism&#xf…

自动化测试中验证码问题如何解决?

经常会被问到如何解决验证码的问题&#xff0c;在此记录一下我所知道的几种方式。 对于web应用来说&#xff0c;大部分的系统在用户登录时都要求用户输入验证码&#xff0c;验证码的类型的很多&#xff0c;有字母数字的&#xff0c;有汉字的&#xff0c;甚至还要用户输入一条算…

让SOME/IP运转起来——SOME/IP系统设计(上)

什么是SOME/IP&#xff1f; SOME/IP&#xff08;Scalable service-Oriented MiddlewarE over IP&#xff09;是AUTOSAR应用层的协议&#xff0c;是基于IP协议的面向服务的可拓展性的中间件。 SOME/IP中主要定义了&#xff1a; 数据的序列化&#xff1a;SOME/IP支持的数据类型…

Web开发介绍详细介绍

Web开发介绍 1 什么是web开发 Web&#xff1a;全球广域网&#xff0c;也称为万维网(www World Wide Web)&#xff0c;能够通过浏览器访问的网站。 所以Web开发说白了&#xff0c;就是开发网站的&#xff0c;例如下图所示的网站&#xff1a;淘宝&#xff0c;京东等等 那么我们…

SpringBoot集成JPA实现分页和CRUD

SpringBoot集成JPA实现分页和CRUD 文章目录 SpringBoot集成JPA实现分页和CRUDpom.xmlapplication.propertiesaddCategory.jspeditCategory.jsphello.jsplistCategory.jspCategoryCategoryDAOCategoryServiceCategoryServiceImplPage4NavigatorRedisConfigCategoryControllerHel…

基于Springboot+MYSQL+Maven实现的宠物医院管理系统(源码+数据库+运行指导文档+项目运行指导视频)

一、项目简介 本项目是一套基于springboot框架实现的宠物医院管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单…

【Kubernetes】初识k8s--扫盲阶段

文章目录 1、k8s概述2、为什么要有k8s2.1 回顾以往的应用部署方式2.2 容器具有的优势 3、k8s能带来什么 1、k8s概述 kubernetes是一个可移植、可扩展的开源平台&#xff0c;用于管理 容器化 的工作负载和服务&#xff0c;可促进申明式配置和自动化。kubernetes拥有一个庞大且快…

ElasticSearch深度解析入门篇:高效搜索解决方案的介绍与实战案例讲解,带你避坑

ElasticSearch深度解析入门篇&#xff1a;高效搜索解决方案的介绍与实战案例讲解&#xff0c;带你避坑 1.Elasticsearch 产生背景 大规模数据如何检索 如&#xff1a;当系统数据量上了 10 亿、100 亿条的时候&#xff0c;我们在做系统架构的时候通常会从以下角度去考虑问题&a…

【C语法学习】15 - fopen()函数

文章目录 1 函数原型2 返回值3 参数3.1 文件名3.2 模式3.2.1 以"r"模式打开3.2.2 以"w"模式打开3.2.3 以"a"模式打开3.2.4 以"r"模式打开3.2.5 以"w"模式打开3.2.6 以"a"模式打开 1 函数原型 fopen()&#xff1a…

右击显示Pycharm打开教程

效果图 操作流程 win r 输入 regedit 回车打开注册表编辑器 2.找到 shell 路径 计算机\HKEY_CLASSES_ROOT\Directory\shell3.在 shell 下新建项&#xff0c;名称为 Pycharm 单击Pycharm文件夹&#xff0c;双击默认项&#xff0c;修改默认值&#xff0c;这个数值就是你右击后…

【Linux】 shutdown 命令使用

shutdown 命令可以用来进行关机程序&#xff0c;并且在关机以前传送讯息给所有使用者正在执行的程序&#xff0c;shutdown 也可以用来重开机。使用权限&#xff1a;系统管理者。 语法 shutdown [选项] 时间 [警告信息] 命令选项及作用 执行令 man shutdown 执行命令结果 参…

计算虚拟化2——内存虚拟化

目录 物理机内存访问过程 虚拟地址VA和物理地址PA概念 MUU实现VA到PA所使用的映射表 内存虚拟化类型 内存软件辅助虚拟化 内存硬件辅助虚拟化 内存虚拟化-内存超分配 内存共享 内存置换 内存气泡 物理机内存访问过程 内存的基本知识 内存都是从物理地址0开始的&…

golang工程——opentelemetry简介、架构、概念、追踪原理

opentelemetry 简介 OpenTelemetry&#xff0c;简称OTel&#xff0c;是一个与供应商无关的开源可观测性框架&#xff0c;用于检测、生成、收集和导出 遥测数据&#xff0c;如轨迹、度量、日志。OTel的目标是提供一套标准化的供应商无关SDK、API和工具&#xff0c;用于接 收、…

阿里云免费服务器

文章目录 最近的阿里云活动By the way在云服务器ECS上搭建个人网站正文补充:定期释放补充:不知道阿里云服务器的密码怎么办?成果补充&#xff1a;怎么找到实例操作的后台&#xff1f;补充&#xff1a;怎么查看服务器到期时间&#xff1f; 究竟白嫖了多少&#xff1f;最后&…

[论文笔记]RetroMAE

引言 RetroMAE,中文题目为 通过掩码自编码器预训练面向检索的语言模型。 尽管现在已经在许多重要的自然语言处理任务上进行了预训练,但对于密集检索来说,仍然需要探索有效的预训练策略。 本篇工作,作者提出RetroMAE,一个新的基于掩码自编码器(Masked Auto-Encoder,MAE)…

【leetcode】17.04 消失的数字

目录 1. 思路2. 代码 题目链接&#xff1a;leetcode 17.04.消失的数字 题目描述&#xff1a; 1. 思路 要求算法复杂度为O(n)&#xff0c;有两种方式&#xff1a; &#xff08;1&#xff09;利用异或交换律 与nums所有元素异或一遍&#xff1b;与0-n的值异或&#xff0c;n…

开源 | 30余套STM32单片机、嵌入式Linux、物联网、人工智能项目(开发板+教程+视频)

文末免费领取&#xff01; 30余套综合项目案例 STM32单片机、嵌入式、物联网、人工智能 项目文档源码视频 高校教学、学生毕设、个人项目练手 嵌入式实战项目推荐 15个嵌入式LinuxQt综合应用项目&#xff0c;涉及家居、医疗、农业等多种应用领域&#xff0c;案例中使用了嵌…

Linux高级命令(扩展)二

一、Linux下用户管理 1、用户概念以及基本作用 用户&#xff1a;指的是Linux操作系统中用于管理系统或者服务的人 一问&#xff1a;管理系统到底在管理什么&#xff1f; 答&#xff1a;Linux下一切皆文件&#xff0c;所以用户管理的是相应的文件 二问&#xff1a;如何管理…