当前位置: 代码网 > it编程>编程语言>Java > java的单元测试和反射

java的单元测试和反射

2024年08月01日 Java 我要评论
Junit单元测试框架:可以用来对方法进行测试有点:可以灵活的编写测试代码,可以针对某个方法进行测试,也支持一键完成对全部方法的自动发测试,且各自独立。

单元测试

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

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

有点:

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

步骤:

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

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

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 constructor<?>[] getdeclaredconstructors()

public constructor<t> getconstructor(class<?>... parametertypes)

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)
 //获取对象
       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 field getfield(string name)

 public field[] getdeclaredfields()

public field getdeclaredfield(string name)

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

public method getmethod(string name, class<?>... parametertypes)

public method[] getdeclaredmethods()

public method getdeclaredmethod(string name, class<?>... parametertypes)

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)

          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();
        }

    }
}

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com