java的单元测试和反射

news2025/1/23 7:25:27

单元测试

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

Junit单元测试框架:
可以用来对方法进行测试

有点:

可以灵活的编写测试代码,可以针对某个方法进行测试,也支持一键完成对全部方法的自动发测试,且各自独立

步骤:

  1. 测试的方法必须是 公共,无参,无返回值
  2. 测试方法必须声明@Test注解

反射:
反射就是加载类,并允许以编程的方式解剖类中的各种成分

  • 反射第一步:加载类,获取类的字节码:Class对象
  • 反射第二步:获取类的构造器:Constructor对象
  • 反射第三步:获取类的成员变量:Field对象
  • 反射第四步:获取类的成员方法:Method对象

获取类Class对象的三种方法:

  1. Class c1=类名.class
  2. 调用Class提供的方法:public static Class forName(String package);
  3. Object提供的方法:public Class getClass():class c3=对象.getClass();
class Student
{
  private int age;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
};
public class test1 {
    public static void main(String[] args) throws Exception{
        Student s=new Student();
        Class c1=s.getClass();
        System.out.println(c1.getName());//com.he.reflect.Student
        System.out.println(c1.getSimpleName());//Student,获取类名

        Class c2=Class.forName("com.he.reflect.Student");//跟c1是同一个对象
        System.out.println(c1==c2);//地址一样
        System.out.println(c2.getName());

        Class c3= Student.class;
        System.out.println(c1==c3);//true

    }
}

获取类的构造器

Class类

public Constructor<?>[] getConstructors()

获取全部构造器(只能获取public修饰的)

public Constructor<?>[] getDeclaredConstructors()

获取全部构造器(包括私有) 

public Constructor<T> getConstructor(Class<?>... parameterTypes)

获取某个构造器(只能获取public修饰的) ,参数是构造器里面的类型

public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)

获取某个构造器(包括私有) 

public class Dog {
    private String name;
    private int age;

    public Dog() {
    }

    public Dog(String name, int age) {
        this.name = name;
        this.age = age;
    }
    private Dog(String name)
    {
        this.name=name;
    }

    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;
    }
}
public class test2 {
    public static void main(String[] args) throws NoSuchMethodException {
        //1:反射第一步,获取类的Class对象
        Class c=Dog.class;
        //2:获取类的全部构造器,构造器对象
        Constructor[] constructors = c.getConstructors();//只能获取public修饰的
        //3:遍历数组中的每个元素
        for(Constructor constructor:constructors)
        {
            System.out.println(constructor.getName()+"-->"+constructor.getParameterCount());
            /*com.he.reflect.Dog-->0
            com.he.reflect.Dog-->2*/
        }
        Constructor[] declaredConstructors = c.getDeclaredConstructors();//可以获取私有的构造器
        for (Constructor declaredConstructor : declaredConstructors) {
            System.out.println(declaredConstructor.getName()+"-->"+declaredConstructor.getParameterCount());
           /* com.he.reflect.Dog-->0
            com.he.reflect.Dog-->2
            com.he.reflect.Dog-->1*/
        }

        //4:获取某个构造器
        Constructor constructor = c.getConstructor();//获取无参构造器
        System.out.println(constructor.getName()+"-->"+constructor.getParameterCount());//com.he.reflect.Dog-->0

        Constructor declaredConstructor = c.getDeclaredConstructor(String.class, int.class);
        //获取有(string int)类型的构造器
        System.out.println(declaredConstructor.getName()+"-->"+declaredConstructor.getParameterCount());
        //com.he.reflect.Dog-->2


    }
}

获取构造器的作用:初始化对象

Constructor类:
public T newInstance(Object... initargs)

调用此构造器对象表示的构造器,并传入参数,完成对对象的初始化并返回 

public void setAccessible(boolean flag)

设置为true,表示禁止检查访问控制,可以访问私有的构造器 

 //获取对象
       Dog dog1 = (Dog)constructor.newInstance();//获取无参构造器的对象
        System.out.println(dog1);//Dog{name='null', age=0}

        Constructor Dcon = c.getDeclaredConstructor(String.class);//获取私有的有参构造器


        Dcon.setAccessible(true);//因为此构造器是私有的,所以设置为禁止检查访问控制
        Dog dog2= (Dog) Dcon.newInstance("hhh");//创建一个name=hhh的对象
        //Dog{name='null', age=0}

获取类的成员变量:


Class类的方法:
public Field[] getFields()

获取类的全部变量(只能是public修饰的) 

 public Field getField(String name)

获取类的某个变量(只能是public修饰的) 

 public Field[] getDeclaredFields()

获取类的全部变量(包括private)

public Field getDeclaredField(String name)

获取类的某个变量 (包括private)

public class test3 {
    public static void main(String[] args) throws Exception{
        //反射第一步,获取类
        Class c=Dog.class;

        //获取成员变量,只能获得public修饰的
        Field[] fields = c.getFields();

        //获取成员变量,包括private
        Field[] declaredFields = c.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            System.out.println(declaredField.getName()+"-->"+declaredField.getType());
//            name-->class java.lang.String
//            age-->int
        }

        //获取某个成员变量
        Field name = c.getDeclaredField("name");//因为是private修饰的,需要在前面加上
        System.out.println(name.getName()+"-->"+name.getType());
        //name-->class java.lang.String


    }
}

获取成员变量的作用:赋值取值

Field类:
public void set(Object obj, Object value)

赋值 

public Object get(Object obj)

取值 

public void setAccessible(boolean flag)

 设置为true,表示禁止检查访问控制,可以访问私有的成员变量

 //赋值
        Dog d=new Dog();
        name.setAccessible(true);
        name.set(d,"aaa");//把Dog类型对象d的成员变量name设置为aaa,因为是private修饰的,需要在前面加上

        //取值
        System.out.println(name.get(d));//aaa

 获取类的成员方法

Class类:
public Method[] getMethods()

获取类的全部成员方法(只能是publici修饰的)

public Method getMethod(String name, Class<?>... parameterTypes)

获取某个方法(只能是pubilc修饰的),name是成员方法的名字,第二个参数是方法里面参数的类型,没有参数就不写 

public Method[] getDeclaredMethods()

 获取类的全部成员方法(包括private)

public Method getDeclaredMethod(String name, Class<?>... parameterTypes)

 获取某个方法(包括private)

public class test4 {
    public static void main(String[] args) throws Exception{
        //反射第一步,获取类
        Class c=Dog.class;

        //获取方法
        Method[] methods = c.getMethods();//只有public修饰的方法
        for (Method method : methods) {
            System.out.println(method.getName()+"-->"+method.getParameterCount()+"-->"+method.getReturnType());
        }

        //获取某个方法
        Method eat = c.getDeclaredMethod("eat");//private修饰的
        System.out.println(eat.getName()+"-->"+eat.getParameterCount()+"-->"+eat.getReturnType());
        //eat-->0-->void


    }
}

获取成员方法的作用:依然是执行

Method类:


public Object invoke(Object obj, Object... args)

触发某个对象的该方法执行 ,第一个参数是对象,第二个可变参数是传给方法的参数

public void setAccessible(boolean flag)

 设置为true,表示禁止检查访问控制,可以访问私有的成员方法

          Dog d=new Dog();
        eat.setAccessible(true);//禁止检查访问权限
        eat.invoke(d);//eat方法是private修饰的
        //dog is eating

例子:对于任意一个对象,把该对象的所有成员变量的名字和对应的值写到文件中

public class test5 {
    public static void main(String[] args) throws Exception{
        Dog dog=new Dog("hhh",18);
        //反射第一步,获取Class
        Class c= dog.getClass();

        //获取全部成员变量
        Field[] declaredFields = c.getDeclaredFields();


        try(
                OutputStream out=new FileOutputStream("day19-juint-app\\src\\test1.txt");
                //包装
                PrintStream Pout=new PrintStream(out);
                )
        {
            Pout.println("----"+c.getSimpleName()+"-----");
            for (Field declaredField : declaredFields) {
                String name=(String)declaredField.getName();//获取变量的名字

                declaredField.setAccessible(true);//因为访问的是私有成员
               String s=  declaredField.get(dog)+"";//获取变量的内容

                Pout.println(name+"的内容是"+s);
            }
        }catch (Exception e)
        {
            e.printStackTrace();
        }

    }
}

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

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

相关文章

【C++初阶】vector使用特性 vector模拟实现

1.vector的介绍及其使用 1.1 vector的介绍 vector文档介绍 1. vector是表示可变大小数组的序列容器。 2. 就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问&#xff0c;和数组一样高效。但是又不像数组&#…

分类神经网络1:VGGNet模型复现

目录 分类网络的常见形式 VGG网络架构 VGG网络部分实现代码 分类网络的常见形式 常见的分类网络通常由特征提取部分和分类部分组成。 特征提取部分实质就是各种神经网络&#xff0c;如VGG、ResNet、DenseNet、MobileNet等。其负责捕获数据的有用信息&#xff0c;一般是通过…

第24天:安全开发-PHP应用文件管理模块显示上传黑白名单类型过滤访问控制

第二十四天 一、PHP文件管理-显示&上传功能实现 如果被抓包抓到数据包&#xff0c;并修改Content-Type内容 则也可以绕过筛查 正常进行上传和下载 二、文件上传-$_FILES&过滤机制实现 无过滤机制 黑名单过滤机制 使用 explode 函数通过点号分割文件名&#xff0c;…

Spring Boot | Spring Boot 默认 “缓存管理“ 、Spring Boot “缓存注解“ 介绍

目录: 一、Spring Boot 默认 "缓存" 管理 :1.1 基础环境搭建① 准备数据② 创建项目③ 编写 "数据库表" 对应的 "实体类"④ 编写 "操作数据库" 的 Repository接口文件⑤ 编写 "业务操作列" Service文件⑥ 编写 "applic…

【 AIGC 研究最新方向(下)】面向平面、视觉、时尚设计的高可用 AIGC 研究方向总结

目前面向平面、视觉、时尚等设计领域的高可用 AIGC 方向有以下 4 种&#xff1a; 透明图层生成可控生成图像定制化SVG 生成 本篇&#xff08;下篇&#xff09;介绍 3、4&#xff0c;上篇在&#xff1a;https://blog.csdn.net/weixin_44212848/article/details/138035279?spm…

【FFmpeg】视频与图片互相转换 ( 视频与 JPG 静态图片互相转换 | 视频与 GIF 动态图片互相转换 )

文章目录 一、视频与 JPG 静态图片互相转换1、视频转静态图片2、视频转多张静态图片3、多张静态图片转视频 二、视频与 GIF 动态图片互相转换1、视频转成 GIF 动态图片2、 GIF 动态图片转成视频 一、视频与 JPG 静态图片互相转换 1、视频转静态图片 执行 ffmpeg -i input.mp4 …

初始化Git仓库时应该运行哪个命令?

文章目录 初始化Git仓库时&#xff0c;你应该运行git init这个命令。这个命令的作用是在你当前所在的目录里创建一个新的Git仓库。这样&#xff0c;你就可以在这个目录里开始使用Git来管理你的文件了。 下面我给你举个详细的例子来说明一下&#xff1a; 首先&#xff0c;你需要…

# 从浅入深 学习 SpringCloud 微服务架构(三)注册中心 Eureka(3)

从浅入深 学习 SpringCloud 微服务架构&#xff08;三&#xff09;注册中心 Eureka&#xff08;3&#xff09; 段子手168 1、eureka&#xff1a;高可用的引入 Eureka Server 可以通过运行多个实例并相互注册的方式实现高可用部署&#xff0c; Eureka Server 实例会彼此增量地…

Spark和Hadoop的安装

实验内容和要求 1&#xff0e;安装Hadoop和Spark 进入Linux系统&#xff0c;完成Hadoop伪分布式模式的安装。完成Hadoop的安装以后&#xff0c;再安装Spark&#xff08;Local模式&#xff09;。 2&#xff0e;HDFS常用操作 使用hadoop用户名登录进入Linux系统&#xff0c;启动…

ChatGPT研究论文提示词集合2-【形成假设、设计研究方法】

点击下方▼▼▼▼链接直达AIPaperPass &#xff01; AIPaperPass - AI论文写作指导平台 目录 1.形成假设 2.设计研究方法 3.书籍介绍 AIPaperPass智能论文写作平台 近期小编按照学术论文的流程&#xff0c;精心准备一套学术研究各个流程的提示词集合。总共14个步骤&#…

Llama3新一代 Llama模型

最近&#xff0c;Meta 发布了 Llama3 模型&#xff0c;从发布的数据来看&#xff0c;性能已经超越了 Gemini 1.5 和 Claud 3。 Llama 官网说&#xff0c;他们未来是要支持多语言和多模态的&#xff0c;希望那天赶紧到来。 未来 Llama3还将推出一个 400B大模型&#xff0c;目前…

Linux--链表 第二十五天

1. 链表 t1.next -> data t1.next->next->data .(点号)的优先级比->的大 所以 t1.next->data 就可以了 不用(t1.next)->data 2. 链表的静态增加和动态遍历 打印链表算法&#xff0c; void printLink(struct Test *head) { struct Te…

安装和部署maven

准备工作 maven下载地址&#xff1a;https://maven.apache.org/download.cgi 使用wget将maven包下载到linux环境上&#xff0c;/toos/ 目录下&#xff08;也可用迅雷&#xff09; wget https://dlcdn.apache.org/maven/maven-3/3.9.6/binaries/apache-maven-3.9.6-bin.tar.g…

PaddleOCRV4训练自己的模型(4)------模型推理及导出

一、Det模型推理&#xff1a; &#xff08;1&#xff09;上一篇文章只讲了推理的实现方法&#xff0c;没有展示结果&#xff0c;这里顺带展示一下结果。 因为训练定位模型的时候是整图训练&#xff0c;所以推理的时候也是整图推理。 &#xff08;2&#xff09;在推理的时候可以…

LinkedList和链表

1.ArrayList的缺陷 ArraryList由于底层是一段连续的空间&#xff0c;所以在ArrayList任意位置插入或者删除元素时&#xff0c;就 需要将后续元素往前或者往后搬移&#xff0c;时间复杂度为O(n)&#xff0c;效率比较低&#xff0c;因此ArrayList不适合做任意位置插入和删除比较…

断言(Assertion)在IT技术中的确切含义— 基于四类典型场景的分析

当“断言”&#xff08;Assertion&#xff09;一词成为IT术语时&#xff0c;语义的混沌性和二义性也随之而生。那么&#xff0c;何为断言&#xff1f;断言何为&#xff1f;实际上&#xff0c;只需分析四种典型场景&#xff0c;确切答案和准确描述就将自然显现。 在SAML&#xf…

【讲解下Spring Boot单元测试】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

数据可视化(七):Pandas香港酒店数据高级分析,涉及相关系数,协方差,数据离散化,透视表等精美可视化展示

Tips&#xff1a;"分享是快乐的源泉&#x1f4a7;&#xff0c;在我的博客里&#xff0c;不仅有知识的海洋&#x1f30a;&#xff0c;还有满满的正能量加持&#x1f4aa;&#xff0c;快来和我一起分享这份快乐吧&#x1f60a;&#xff01; 喜欢我的博客的话&#xff0c;记得…

websocket 请求头报错 Provisional headers are shown 的解决方法

今日简单总结 websocket 使用过程中遇到的问题&#xff0c;主要从以下三个方面来分享&#xff1a; 1、前端部分 websocket 代码 2、使用 koa.js 实现后端 websocket 服务搭建 3、和后端 java Netty 库对接时遇到连接失败问题 一、前端部分 websocket 代码 <template>…

B2024 输出浮点数 洛谷题单

首选需要进行了解的就是%a.bf所代表的含义就行了&#xff0c;直接莽了&#xff0c;没啥解释的笑脸&#x1f644; 在 Python 中&#xff0c;%a.bf 中的参数 a 和 b 是用来格式化浮点数的输出的&#xff0c;具体含义如下&#xff1a; a 表示总输出宽度&#xff0c;包括小数点、…