java的单元测试和反射

这篇具有很好参考价值的文章主要介绍了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.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修饰的)

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-->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)

设置为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();

        //获取成员变量,包括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)

 设置为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);
        //反射第一步,获取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();
        }

    }
}

java的单元测试和反射,log4j,java,前端,jvm,javascript,单元测试文章来源地址https://www.toymoban.com/news/detail-861354.html

到了这里,关于java的单元测试和反射的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java 项目日志实例基础:Log4j

    点击下方关注我,然后右上角点击...“设为星标”,就能第一时间收到更新推送啦~~~ 介绍几个日志使用方面的基础知识。 1 Log4j 1、Log4j 介绍 Log4j(log for java)是 Apache 的一个开源项目,通过使用 Log4j,我们可以控制日志信息输出到日志文件、也可以控制每一条日志的输出格式

    2024年02月12日
    浏览(12)
  • 【java安全】Log4j反序列化漏洞

    关于Apache Log4j Log4j是Apache的开源项目,可以实现对System.out等打印语句的替代,并且可以结合spring等项目,实现把日志输出到控制台或文件等。而且它还可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码,满足了大多数要求。 就是用来打印日志的 漏洞成因

    2024年02月11日
    浏览(14)
  • java web中部署log4j.xml

    标题:Java Web中部署log4j.xml 目录: 1. 介绍 2. 配置log4j.xml文件 3. 配置web.xml文件 4. 配置Spring框架 5. 配置Spring Bean 6. 总结 ## 1. 介绍 在Java Web开发中,日志记录是非常重要的一部分。log4j是一个常用的Java日志记录框架,它提供了灵活的配置和强大的日志功能。本篇博客将介绍如何

    2024年02月09日
    浏览(10)
  • logging.level的含义及设置 【java 日志 (logback、log4j)】

    日志级别 tracedebuginfowarnerrorfatal 常用的有:debug,info,warn,error 通常我们想设置日志级别,会用到 logging.level.root=info logging.level设置日志级别,后面跟生效的区域。root表示整个项目。 也可以写某个包,或者某个类。 例如:logging.level.com.ali.service=error。在com.ali.service包下所有

    2024年02月10日
    浏览(12)
  • java 使用log4j显示到界面和文件 并格式化

    jar包https://dlcdn.apache.org/logging/log4j/2.20.0/apache-log4j-2.20.0-bin.zip sources是源码包,可以看到说明。在IDEA里先加入class jar后,再双击这个class jar包或或右键选Navigate ,Add ,选对应的Sources.jar  解释一下 \\\"%d{yyyy-MM-dd HH:mm:ss} %c [%p] - %m%n\\\" 每个部分的含义: %d{yyyy-MM-dd HH:mm:ss} :表示输出日

    2024年02月12日
    浏览(9)
  • java slf4j,Commons Logging与log4j,Logback,tinylog和异常配合使用

    1、日志是什么?         日志是每天记录我们程序情况的。日志管理的目的是为了记录日志。 2、为什么会有日志?         1、问题追溯,通过日志文件的记录可以使我们运维或者程序员快速查找问题根源。         2、状态检测,检测我们系统状况,为项目出现的问题做

    2024年02月16日
    浏览(15)
  • JAVA中使用log4j及slf4j进行日志输出的方法

    JAVA中输出日志比较常用的是log4j,这里讲下log4j的配置和使用方法,以及slf4j的使用方法。 一、下载log4j的架包,并导入项目中,如下: 二、创建log4j.properties配置文件 1、log4j配置文件的位置: (1)如果是java project项目,则在项目的根目录下创建log4j.properties而不是在src目录下

    2024年02月07日
    浏览(12)
  • Maven编译java及解决程序包org.apache.logging.log4j不存在问题

    1、首先新建一个文件夹,比如hello Hello里新建pom.xml 注意上面dependencies部分用于解决程序包org.apache.logging.log4j不存在问题,即 Maven编译java及解决程序包org.apache.logging.log4j不存在问题 和文件夹srcmainjava java里新建Exploit.java和LogTest.java Exploit.java LogTest.java 2、然后使用meve compile编

    2024年02月10日
    浏览(12)
  • elasticsearch-7.13.3 升级log4j 到log4j-2.17.1

    1、升级原因 log4j低版本存在严重漏洞,根据需要升级到安全版本,不一定是最新。 log4j-2.17.1 jar包下载地址https://archive.apache.org/dist/logging/log4j/2.17.1/ 2、下载后解压apache-log4j-2.17.1-bin.tar.gz 升级需要用到截图中四个jar包 3、升级 删除旧版本log4j 进入elasticsearch-7.13.3目录 $ rm -rf l

    2024年02月12日
    浏览(13)
  • Log4J

    为什么要用日志? -- 方便调试代码 什么时候用?什么时候不用? ​ 出错调试代码时候用 生产环境下就不需要,就需要删除 怎么用? -- 输出语句 ​ log4j是Apache的一个开放源代码的项目,通过使用log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服

    2024年02月08日
    浏览(12)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包