0


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();
  1. class Student
  2. {
  3. private int age;
  4. public int getAge() {
  5. return age;
  6. }
  7. public void setAge(int age) {
  8. this.age = age;
  9. }
  10. };
  11. public class test1 {
  12. public static void main(String[] args) throws Exception{
  13. Student s=new Student();
  14. Class c1=s.getClass();
  15. System.out.println(c1.getName());//com.he.reflect.Student
  16. System.out.println(c1.getSimpleName());//Student,获取类名
  17. Class c2=Class.forName("com.he.reflect.Student");//跟c1是同一个对象
  18. System.out.println(c1==c2);//地址一样
  19. System.out.println(c2.getName());
  20. Class c3= Student.class;
  21. System.out.println(c1==c3);//true
  22. }
  23. }

获取类的构造器

Class类

public Constructor<?>[] getConstructors()

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

public Constructor<?>[] getDeclaredConstructors()

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

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

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

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

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

  1. public class Dog {
  2. private String name;
  3. private int age;
  4. public Dog() {
  5. }
  6. public Dog(String name, int age) {
  7. this.name = name;
  8. this.age = age;
  9. }
  10. private Dog(String name)
  11. {
  12. this.name=name;
  13. }
  14. public String getName() {
  15. return name;
  16. }
  17. public void setName(String name) {
  18. this.name = name;
  19. }
  20. public int getAge() {
  21. return age;
  22. }
  23. public void setAge(int age) {
  24. this.age = age;
  25. }
  26. }
  27. public class test2 {
  28. public static void main(String[] args) throws NoSuchMethodException {
  29. //1:反射第一步,获取类的Class对象
  30. Class c=Dog.class;
  31. //2:获取类的全部构造器,构造器对象
  32. Constructor[] constructors = c.getConstructors();//只能获取public修饰的
  33. //3:遍历数组中的每个元素
  34. for(Constructor constructor:constructors)
  35. {
  36. System.out.println(constructor.getName()+"-->"+constructor.getParameterCount());
  37. /*com.he.reflect.Dog-->0
  38. com.he.reflect.Dog-->2*/
  39. }
  40. Constructor[] declaredConstructors = c.getDeclaredConstructors();//可以获取私有的构造器
  41. for (Constructor declaredConstructor : declaredConstructors) {
  42. System.out.println(declaredConstructor.getName()+"-->"+declaredConstructor.getParameterCount());
  43. /* com.he.reflect.Dog-->0
  44. com.he.reflect.Dog-->2
  45. com.he.reflect.Dog-->1*/
  46. }
  47. //4:获取某个构造器
  48. Constructor constructor = c.getConstructor();//获取无参构造器
  49. System.out.println(constructor.getName()+"-->"+constructor.getParameterCount());//com.he.reflect.Dog-->0
  50. Constructor declaredConstructor = c.getDeclaredConstructor(String.class, int.class);
  51. //获取有(string int)类型的构造器
  52. System.out.println(declaredConstructor.getName()+"-->"+declaredConstructor.getParameterCount());
  53. //com.he.reflect.Dog-->2
  54. }
  55. }

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

Constructor类:

public T newInstance(Object... initargs)

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

public void setAccessible(boolean flag)

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

  1. //获取对象
  2. Dog dog1 = (Dog)constructor.newInstance();//获取无参构造器的对象
  3. System.out.println(dog1);//Dog{name='null', age=0}
  4. Constructor Dcon = c.getDeclaredConstructor(String.class);//获取私有的有参构造器
  5. Dcon.setAccessible(true);//因为此构造器是私有的,所以设置为禁止检查访问控制
  6. Dog dog2= (Dog) Dcon.newInstance("hhh");//创建一个name=hhh的对象
  7. //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)

  1. public class test3 {
  2. public static void main(String[] args) throws Exception{
  3. //反射第一步,获取类
  4. Class c=Dog.class;
  5. //获取成员变量,只能获得public修饰的
  6. Field[] fields = c.getFields();
  7. //获取成员变量,包括private
  8. Field[] declaredFields = c.getDeclaredFields();
  9. for (Field declaredField : declaredFields) {
  10. System.out.println(declaredField.getName()+"-->"+declaredField.getType());
  11. // name-->class java.lang.String
  12. // age-->int
  13. }
  14. //获取某个成员变量
  15. Field name = c.getDeclaredField("name");//因为是private修饰的,需要在前面加上
  16. System.out.println(name.getName()+"-->"+name.getType());
  17. //name-->class java.lang.String
  18. }
  19. }

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

Field类:

public void set(Object obj, Object value)

赋值

public Object get(Object obj)

取值

public void setAccessible(boolean flag)

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

  1. //赋值
  2. Dog d=new Dog();
  3. name.setAccessible(true);
  4. name.set(d,"aaa");//把Dog类型对象d的成员变量name设置为aaa,因为是private修饰的,需要在前面加上
  5. //取值
  6. 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)

  1. public class test4 {
  2. public static void main(String[] args) throws Exception{
  3. //反射第一步,获取类
  4. Class c=Dog.class;
  5. //获取方法
  6. Method[] methods = c.getMethods();//只有public修饰的方法
  7. for (Method method : methods) {
  8. System.out.println(method.getName()+"-->"+method.getParameterCount()+"-->"+method.getReturnType());
  9. }
  10. //获取某个方法
  11. Method eat = c.getDeclaredMethod("eat");//private修饰的
  12. System.out.println(eat.getName()+"-->"+eat.getParameterCount()+"-->"+eat.getReturnType());
  13. //eat-->0-->void
  14. }
  15. }

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

Method类:

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

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

public void setAccessible(boolean flag)

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

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

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

  1. public class test5 {
  2. public static void main(String[] args) throws Exception{
  3. Dog dog=new Dog("hhh",18);
  4. //反射第一步,获取Class
  5. Class c= dog.getClass();
  6. //获取全部成员变量
  7. Field[] declaredFields = c.getDeclaredFields();
  8. try(
  9. OutputStream out=new FileOutputStream("day19-juint-app\\src\\test1.txt");
  10. //包装
  11. PrintStream Pout=new PrintStream(out);
  12. )
  13. {
  14. Pout.println("----"+c.getSimpleName()+"-----");
  15. for (Field declaredField : declaredFields) {
  16. String name=(String)declaredField.getName();//获取变量的名字
  17. declaredField.setAccessible(true);//因为访问的是私有成员
  18. String s= declaredField.get(dog)+"";//获取变量的内容
  19. Pout.println(name+"的内容是"+s);
  20. }
  21. }catch (Exception e)
  22. {
  23. e.printStackTrace();
  24. }
  25. }
  26. }

标签: log4j java 前端

本文转载自: https://blog.csdn.net/luosuss/article/details/138012130
版权归原作者 落落落sss 所有, 如有侵权,请联系我们删除。

“java的单元测试和反射”的评论:

还没有评论