• 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. }

  • 相关阅读:
    使用.NET简单实现一个Redis的高性能克隆版(三)
    泛型+IO流基础知识+java->符号 lambda表达式
    容灾演练月报 | 雅安市商业银行四大业务系统完成容灾切换演练
    「Python实用秘技05」在Python中妙用短路机制
    Docker | redis集群部署实战
    hadoop生态圈面试精华之zookeeper(一)
    微信小程序实现lot开发02 使用微信小程序发起网络请求
    发送消息(二)RoutingKafkaTemplate,DefaultKafkaProducerFactory和 ReplyingKafkaTemplate
    Shiro学习与笔记
    usb2 packet format
  • 原文地址:https://blog.csdn.net/luosuss/article/details/138012130