java的单元测试和反射

news/2024/11/13 9:32:08/

单元测试

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

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();
java">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)

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

java">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,表示禁止检查访问控制,可以访问私有的构造器 

java"> //获取对象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)

java">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,表示禁止检查访问控制,可以访问私有的成员变量

java"> //赋值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)

java">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,表示禁止检查访问控制,可以访问私有的成员方法

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

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

java">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.ppmy.cn/news/1435496.html

相关文章

不碎片化学习,尽量用整块的时间系统化学习

从高中毕业之后&#xff0c;我们好像就很难再继续那种系统化的学习&#xff0c;甚至失去了自我知识构建的能力。然而&#xff0c;真正的理解和掌握知识需要深入和连贯&#xff0c;这正是系统化学习的优势所在。 系统化学习的重要性 全面理解&#xff1a;系统化学习能够帮助我…

部署轻量级Gitea替代GitLab进行版本控制(一)

Gitea 是一款使用 Golang 编写的可自运营的代码管理工具。 Gitea Official Website gitea: Gitea的首要目标是创建一个极易安装&#xff0c;运行非常快速&#xff0c;安装和使用体验良好的自建 Git 服务。我们采用Go作为后端语言&#xff0c;这使我们只要生成一个可执行程序即…

SQLAlchemy的使用

SQLAlchemy中filter函数的使用 https://blog.csdn.net/m0_67093160/article/details/133318889 创建临时字段 select id , CONCAT(‘内容’) AS fullname from example_table; Pandas数据类型转换_pandas转换数据类型 https://blog.csdn.net/qq_41404557/article/details/125…

设计前后端系统以处理长时间运行的计算任务并提供缓存支持

后端设计 1. 任务队列 创建一个任务队列来存储提交的计算任务。 Component public class TaskQueue {private final Queue<CalculationTask> queue new LinkedList<>();public synchronized void addTask(CalculationTask task) {queue.add(task);}public sync…

【数据结构】树和森林(树和森林的存储结构、树森林二叉树的转换、树和森林的遍历

5.树和森林 5.1 树的存储结构 树的逻辑结构 树是n个结点的有限集合。n0时称为空树。 在任意一棵非空树中应满足&#xff1a; 1&#xff09;有且只有一个特定的根结点&#xff1b; 2&#xff09;当n>1&#xff0c;其余结点可分为m个互不相交的有限集合&#xff0c;每个集合本…

【CSS】CSS实现元素逐渐消失(实现元素透明逐渐消失/模糊)

mask-image: linear-gradient(to bottom, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 1) 10%);mask-image 属性用于定义一个遮罩&#xff0c;它可以隐藏元素的一部分或全部内容。在这个示例中&#xff0c;我们使用 mask-image 属性来定义一个线性渐变的遮罩&#xff0c;使得列表项的内…

目标检测YOLO数据集的三种格式及转换

目标检测YOLO数据集的三种格式 在目标检测领域&#xff0c;YOLO&#xff08;You Only Look Once&#xff09;算法是一个流行的选择。为了训练和测试YOLO模型&#xff0c;需要将数据集格式化为YOLO可以识别的格式。以下是三种常见的YOLO数据集格式及其特点和转换方法。 1. YOL…

Ubuntu查看端口状态

完蛋了&#xff0c;好像动心了&#xff0c;近一周吃啥东西都索然无味&#xff0c;这可如何是好&#xff01;&#xff01;&#xff01;不知道在期待什么&#xff0c;恐惧与窃喜—— 在Ubuntu系统中&#xff0c;查看某个端口是否被放行&#xff08;即允许流量通过&#xff09;&am…