java的单元测试和反射

单元测试

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

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.StudentSystem.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-->0com.he.reflect.Dog-->2*/}Constructor[] declaredConstructors = c.getDeclaredConstructors();//可以获取私有的构造器for (Constructor declaredConstructor : declaredConstructors) {System.out.println(declaredConstructor.getName()+"-->"+declaredConstructor.getParameterCount());/* com.he.reflect.Dog-->0com.he.reflect.Dog-->2com.he.reflect.Dog-->1*/}//4:获取某个构造器Constructor constructor = c.getConstructor();//获取无参构造器System.out.println(constructor.getName()+"-->"+constructor.getParameterCount());//com.he.reflect.Dog-->0Constructor 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();//获取成员变量,包括privateField[] 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);//反射第一步,获取ClassClass 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.hqwc.cn/news/637569.html

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

相关文章

开源王者!全球最强的开源大模型Llama3发布!15万亿数据集训练,最高4000亿参数,数学评测超过GPT-4,全球第二!

本文原文来自DataLearnerAI官方网站&#xff1a; 开源王者&#xff01;全球最强的开源大模型Llama3发布&#xff01;15万亿数据集训练&#xff0c;最高4000亿参数&#xff0c;数学评测超过GPT-4&#xff0c;全球第二&#xff01; | 数据学习者官方网站(Datalearner)https://ww…

使用Python比较两张人脸图像并获得准确度

使用 Python、OpenCV 和人脸识别模块比较两张图像并获得这些图像之间的准确度水平。 一、原理 使用Face Recognition python 模块来获取两张图像的128 个面部编码&#xff0c;并比较这些编码。比较结果返回 True 或 False。如果结果为True &#xff0c;那么两个图像将是相同的…

2024团体程序设计天梯赛L1-104 九宫格

题目链接L1-104 九宫格 #include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int n, mapp[10][10], a[10]; int dx[10]{0, 1, 1, 1, 4, 4, 4, 7, 7, 7}; int dy[10]{0, 1, 4, 7, 1, 4, 7, 1, 4, 7}; b…

2、关于数据库事务那些事

目录 1、什么是事务&#xff1f; 2、介绍下数据库事务&#xff1f; 3、并发事务会带来什么问题&#xff1f; 3.1、不可重复读和幻读有什么区别&#xff1f; 4、数据库隔离级别有哪几种&#xff1f; 5、MySQL默认使用隔离级别是啥&#xff1f; 6、如何控制并发事务&#…

山东大学操作系统实验一(Linux虚拟机实现)

目录 实验题目 实验要求 示例程序 主程序 头文件 重点代码解析 一、main函数的参数 参数介绍 参数输入方式 本块代码 二、信号处理 本块代码 原理介绍 实现效果 三、kill函数 功能介绍 使用方式 本块代码 四、头文件处理 本块代码 代码作用 实验程序 …

2024团体程序设计天梯赛L1-103 整数的持续性

题目链接L1-103 整数的持续性 #include<iostream> #include<stdio.h> #include<algorithm> using namespace std; struct node{int x;int d; }p[2000]; bool cmp(node a, node b) {if (a.d b.d) return a.x < b.x;return a.d>b.d; } int cnt, cntt; v…

日期相关的题目

日期相关的题目 1. 计算日期到天数转换2. 日期累加3. 打印日期4. 日期差值 1. 计算日期到天数转换 输出示例: 思路&#xff1a;计算前n-1个月的天数在加上这个月的天数。 #include <iostream> using namespace std;int main() {int year, month, day;cin >> yea…

自学注解----

MainApplication.java SpringBootApplication类就是—主程序类&#xff0c;告诉你这是一个SpringBoot应用 SpringBootConfiguration—就是Configuration&#xff0c;当前一个配置类 EnableAutoConfiguration— AutoConfigurationPackage自动配置包&#xff0c;包含Import导入包…

【ML】用遗传规划进行因子挖掘

【ML】用遗传规划进行因子挖掘 原创 Yud. 2AMquant 2024-04-02 07:30 广东 本文使用deap pkg进行基于遗传算法的因子挖掘。并对代码进行部分修改。 自定义了多个算子如下&#xff0c;同样包括时间序列相关的算子&#xff1a; winsorize(x) kurtdev(df,window) if_then_els…

信号----硬件中断

硬件中断 键盘组合键是向进程发送信号&#xff0c;那么键盘数据是如何输入到内核中&#xff0c;然后变成信号的&#xff1f;这个信号又是由谁发送给进程的&#xff1f; 当键盘被按下&#xff0c;操作系统先知道用户用键盘输入了内容 那么操作系统是如何知道键盘上有内容了&…

模电期末复习(五)集成运算放大电路

集成运算放大电路 5.1 集成放大电路的特点5.2 集成运放的主要技术指标5.3 集成运放的基本组成部分5.3.1 偏置电路5.3.2 差分放大输入级5.3.3 中间级5.3.4 输出级 5.4 集成运放的典型电路5.4.1 双极型集成运放LM741 5.5 各类集成运放的性能特点5.6 集成运放使用中的几个具体问题…

【Linux驱动层】iTOP-RK3568学习之路(三):字符设备驱动框架

一、总体框架图 二、字符设备相关函数 静态申请设备号 register_chrdev_region 函数原型&#xff1a;register_chrdev_region(dev_t from, unsigned count, const char *name) 函数作用&#xff1a;静态申请设备号&#xff0c;可以一次性申请多个连续的号&#xff0c;count指定…