单元测试&反射&注解

这篇具有很好参考价值的文章主要介绍了单元测试&反射&注解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

单元测试

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

咱们之前是如何进行单元测试的?有啥问题 ? 

单元测试&反射&注解,单元测试,java,开发语言 

Junit单元测试框架 

          可以用来对方法进行测试,它是由Junit公司开源出来的 

具体步骤 

 Junit框架的常见注解

单元测试&反射&注解,单元测试,java,开发语言

public class StringUtilTest {

    @Test
    @Before
    public void testPrintNumber(){

        StringUtil.printNumber("哈哈");
        StringUtil.printNumber(null);
    }

    @Test
    public void testGetMaxIndex(){

        int sum = new StringUtil().getMaxIndex("蝙蝠侠不打你了");
        System.out.println(sum);

        Assert.assertEquals("警告,警告",6,sum);
    }

    @Test
    @After
    public void testPrint(){

        System.err.println("结束");
    }
}

 反射(Reflection)

          反射就是:加载类,并允许以编程的方式解剖类中的各种成分(成员变量、方法、构造器等)。 

                                              单元测试&反射&注解,单元测试,java,开发语言

反射学什么? 

单元测试&反射&注解,单元测试,java,开发语言 

获取Class对象的三种方式 

1.直接使用类名.class获取:Class c1 = 类名.class

2.调用Class提供的方法:Class c2 = Class.forName("全类名")

3.调用Object提供的方法:Class c3 = 对象.getClass() 

public class Demo1 {

    @Test
   public void testDemo01() throws ClassNotFoundException {
       Class catClass = Cat.class;
       System.out.println(catClass.getName());

       Class aClass = Class.forName("com.itheima.b_反射.Cat");
       System.out.println(aClass);

       Class aClass1 = new Cat().getClass();
       System.out.println(aClass1);
   }
}

 获取类的构造器

单元测试&反射&注解,单元测试,java,开发语言 单元测试&反射&注解,单元测试,java,开发语言

/*
获取构造器[下面是Class的方法]
    Constructor<?>[] getConstructors()	获取所有的公共构造器(只能获取public修饰的)
    Constructor<?>[] getDeclaredConstructors()	获取全部构造器(只要存在就能拿到)
    Constructor<T> getConstructor(Class<?>... parameterTypes)	获取某个公共构造器(只能获取public修饰的)
    Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)	获取某个构造器(只要存在就能拿到)

使用构造器(创建对象)[下面是Constructor的方法]
    T newInstance(Object... initArgs)	调用此构造器对象表示的构造器,并传入参数,完成对象的初始化并返回
    public void  setAccessible(boolean flag)	设置为true,表示禁止检查访问控制(暴力反射)

注意
    使如果想使用private修饰构造器反射创建对象,需要暴力反射(禁止JVM检查构造方法的访问权限)
*/
public class Demo2 {

    @Test
    public void testConstructor() throws NoSuchMethodException {

        Class<Cat> clazz = Cat.class;

        //获取全部构造器(public)
        Constructor[] constructors = clazz.getConstructors();

        for (Constructor constructor : constructors) {
            System.out.println(constructor);
        }

        Constructor<?>[] declaredConstructors = clazz.getDeclaredConstructors();
        for (Constructor<?> declaredConstructor : declaredConstructors) {
            System.out.println(declaredConstructor);
        }

        System.out.println("====================================");

        Constructor<Cat> constructor = clazz.getConstructor();
        System.out.println(constructor);
        System.out.println("===============================");
        Constructor<Cat> declaredConstructor = clazz.getDeclaredConstructor(String.class, int.class);
        System.out.println("方法名:" + declaredConstructor.getName() + "参数个数:"+ declaredConstructor.getParameterCount());
    }

    @Test
    public void testNew() throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {

        Class calazz = Cat.class;

        Constructor declaredConstructor = calazz.getDeclaredConstructor(String.class, int.class);

        declaredConstructor.setAccessible(true);

        Cat 加菲猫 = (Cat)declaredConstructor.newInstance("加菲猫", 3);

        System.out.println(加菲猫);
    }
}

 获取类的成员变量

单元测试&反射&注解,单元测试,java,开发语言 单元测试&反射&注解,单元测试,java,开发语言

public class Demo3 {

   @Test
    public void testField() throws NoSuchFieldException {

       Class<Cat> catClass = Cat.class;

       //获取类的所有公共成员变量(只能获取public修饰的)
       Field[] fields = catClass.getFields();
       for (Field field : fields) {
           System.out.println(field);
       }

       System.out.println("===============");
       //获取类的全部成员变量
       Field[] declaredFields = catClass.getDeclaredFields();
       for (Field declaredField : declaredFields) {
           System.out.println(declaredField.getName() + declaredField.getType());
       }
       System.out.println("====================");
       Field a = catClass.getField("a");//获取某个类的成员变量,只要存在就能拿到
       System.out.println(a);

       Field age = catClass.getDeclaredField("age");
       System.out.println(age);
   }

   @Test
   public void test2() throws NoSuchFieldException, IllegalAccessException {

       Class clazz = Cat.class;

       Cat cat = new Cat();
      // System.out.println(cat);

       Field age = clazz.getDeclaredField("age");

       Field name = clazz.getDeclaredField("name");
       //暴力反射
       age.setAccessible(true);
       name.setAccessible(true);

       age.set(cat,5);
       name.set(cat,"哈哈");
       System.out.println(cat);

       //取值
       Object o = age.get(cat);
       System.out.println(o);
   }
}

 获取类的成员方法

 单元测试&反射&注解,单元测试,java,开发语言

单元测试&反射&注解,单元测试,java,开发语言 

/*
获取成员方法[Class提供]
    Method[] getMethods()	获取类的全部公共成员方法(只能获取public修饰的)
    Method[] getDeclaredMethods()	获取类的全部成员方法(只要存在就能拿到)
    Method getMethod(String name, Class<?>... parameterTypes) 	获取类的某个公共成员方法(只能获取public修饰的)
    Method getDeclaredMethod(String name, Class<?>... parameterTypes)	获取类的某个成员方法(只要存在就能拿到)

使用成员方法(执行方法)[Method提供]
    public Object invoke(Object obj, Object... args)	触发某个对象的该方法执行。
    public void  setAccessible(boolean flag)	设置为true,表示禁止检查访问控制(暴力反射)

注意
    使如果想使用private修饰的成员方法,需要暴力反射
*/
public class Demo4 {

    @Test
    public void testMethods() throws NoSuchMethodException {
        Class<Cat> catClass = Cat.class;

        Method[] methods = catClass.getMethods();
        for (Method method : methods) {
            System.out.println("方法名:"+ method.getName() + "返回值类型:" + method.getReturnType());
        }

        System.out.println("===========================");

        Method[] declaredMethods = catClass.getDeclaredMethods();

        for (Method declaredMethod : declaredMethods) {
            System.out.println("方法名:"+ declaredMethod.getName() + "返回值类型" + declaredMethod.getReturnType());
        }

        System.out.println("===========================");
        Method eat = catClass.getDeclaredMethod("eat");
        System.out.println("方法名:"+ eat.getName() + "返回值类型" + eat.getReturnType());

        System.out.println("===========================");
        Method eat1 = catClass.getDeclaredMethod("eat", String.class);
        System.out.println("方法名:"+ eat1.getName() + "返回值类型" + eat1.getReturnType());
    }

    @Test
    public void tese2() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {

        Class<Cat> clazz = Cat.class;

        Method eat = clazz.getDeclaredMethod("eat", String.class);

        eat.setAccessible(true);

        Cat cat = new Cat();
        Object invoke = eat.invoke(cat, "🐟");
        System.out.println(invoke);
    }
}

案例: 

/*
反射案例
    对于任意一个对象,该框架都可以把对象的字段名和对应的值,然后打印在控制台

*/
public class Demo5 {
    public static void main(String[] args) {
        //1. 准备两个对象
        Student student = new Student("柳岩", 40, '女', 167.5, "女星");
        Teacher teacher = new Teacher("播妞", 6000);

        //2.调用方法

        print(student);
    }

    public static void print(Object o)  {

        try {
            Class clazz = o.getClass();

            Field[] declaredFields = clazz.getDeclaredFields();
            for (Field declaredField : declaredFields) {

                declaredField.setAccessible(true);

                String name = declaredField.getName();
                Object o1 = declaredField.get(o);
                System.out.println(name+o1);
            }
        }catch (Exception e){
        }

    }
}



class Student{
    public Student(String name, int age, char sex, double height, String hobby) {
        this.name = name;
        this.age = age;
        this.sex = sex;
        this.height = height;
        this.hobby = hobby;
    }

    private String name;
    private int age;
    private char sex;
    private double height;
    private String hobby;
}

class Teacher {
    public Teacher(String name, double salary) {
        this.name = name;
        this.salary = salary;
    }

    private String name;
    private double salary;
}

反射的作用 

单元测试&反射&注解,单元测试,java,开发语言 

注解

元注解

            指的是:修饰注解的注解。 

 注解解析器

     就是判断类上、方法上、成员变量上是否存在注解,并把注解里的内容给解析出来。 

如何解析注解 

单元测试&反射&注解,单元测试,java,开发语言 

单元测试&反射&注解,单元测试,java,开发语言 文章来源地址https://www.toymoban.com/news/detail-723118.html

public class ClassNameCheckParser {

    public static void checkClassName(){
        //1.存放不符合规范的类
        ArrayList<String> list = new ArrayList<>();

        //2.获取指定包下的所有类
        Set<Class> clazzSet = ClassUtil.getClasses("com.itheima.c_annotation.example");
        //3.遍历set集合找到标注@ClassNameCheck注解的类'

        for (Class clazz : clazzSet) {

            //判断某个类上是否有某个注解
            if(clazz.isAnnotationPresent(ClassNameCheck.class)){

                //获得类名
                String simpleName = clazz.getSimpleName();
                //检查类名是否以Heima开头
                if(!simpleName.startsWith("Hei")){

                    list.add(simpleName);
                }
            }
        }

        //判断集合中是否有不符合规范的,如果有直接保存
        if(list.size() > 0) {

            System.out.println("下面类名不符合规范");
            for (String name : list) {
                System.out.println(name);
            }
            throw new RuntimeException("程序终止");
        }

    }

}

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

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

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

相关文章

  • Day14:单元测试、Junit单元测试框架、反射、注解

    Day14:单元测试、Junit单元测试框架、反射、注解

    针对最小的功能单元(方法)进行正确性测试 编写正规的单元测试框架 传统的无法执行自动化测试,且无法得到测试报告 Junit的作用: 测试类取名:原类名+Test(大驼峰) 测试方法取名:test+原函数名称(小驼峰) 测试方法:必须public,无参,无返回值 测试方法上面必须加

    2024年04月14日
    浏览(13)
  • Java_单元测试、反射

    Java_单元测试、反射

    1.1 单元测试快速入门 所谓单元测试,就是针对最小的功能单元,编写测试代码对其进行正确性测试。 我们想想,咱们之前是怎么进行测试的呢? 比如说我们写了一个学生管理系统,有添加学生、修改学生、删除学生、查询学生等这些功能。要对这些功能这几个功能进行测试

    2024年01月18日
    浏览(11)
  • java的单元测试和反射

    java的单元测试和反射

    就是针对最小的功能单元,编写测试代码对其进行正确性测试 Junit单元测试框架: 可以用来对方法进行测试 有点: 可以灵活的编写测试代码,可以针对某个方法进行测试,也支持一键完成对全部方法的自动发测试,且各自独立 测试的方法必须是 公共,无参,无返回值 测试

    2024年04月28日
    浏览(10)
  • Java中的单元测试,反射和枚举

    2024年02月05日
    浏览(13)
  • Java SE 学习笔记(十七)—— 单元测试、反射

    Java SE 学习笔记(十七)—— 单元测试、反射

    开发好的系统中存在很多方法,如何对这些方法进行测试? 以前我们都是将代码全部写完再进行测试。其实这样并不是很好。在以后工作的时候,都是写完一部分代码,就测试一部分。这样,代码中的问题可以得到及时修复。也避免了由于代码过多,从而无法准确定位到错误

    2024年02月06日
    浏览(10)
  • JAVA学习-注解.基于注解的单元测试

            基于注解的单元测试是一种使用注解来简化和增强测试代码编写和执行的方法。在Java中,有多个基于注解的单元测试框架可供选择,包括JUnit、TestNG等。下面将对几个常见的基于注解的单元测试框架进行概述,并介绍它们的特点、使用方法以及与其他框架的比较。

    2024年04月28日
    浏览(9)
  • 【Java实用干货】使用@SpringBootTest注解进行单元测试

    【Java实用干货】使用@SpringBootTest注解进行单元测试

    【【Java实用干货】使用@SpringBootTest注解进行单元测试 大家好,我是洲洲,欢迎关注,一个爱听周杰伦的程序员。关注公众号【程序员洲洲】即可获得海量学习资料、面试笔记、大厂独家学习体系路线等…还可以加入技术交流群~ @SpringBootTest注解是SpringBoot自1.4.0版本开始引入的

    2024年02月05日
    浏览(8)
  • [Java学习日记]日志、类加载器、XML、DTD与schema、XML解析、XPath、单元测试、Assert、BeforeAfter、注解、自定义注解、注解案例

    [Java学习日记]日志、类加载器、XML、DTD与schema、XML解析、XPath、单元测试、Assert、BeforeAfter、注解、自定义注解、注解案例

    下面的案例中只是做一个简单的了解,不做深入理解啦 目录 一.使用Logback写日志 二.类加载器 三.XML 四.XML编写规定:DTD与schema 五.XML解析 六.XPath 七.单元测试 七.Assert(断言):检验方法结果 八.使用before与after注解备份与还原数据 九.注解 十.自定义注解 十一.注解案例:用注

    2024年02月04日
    浏览(10)
  • 25.单元测试、反射

    25.单元测试、反射

    单元测试就是针对最小的功能单元编写测试代码,Java程序最小的功能单元是方法。因此,单元测试就是针对Java方法进行的测试,进而检查方法的正确性。 只有一个main方法,如果一个方法的测试失败了,其他测试方法会受到影响。 无法得到测试的结果报告,需要程序员自己

    2024年02月10日
    浏览(6)
  • 【go语言开发】编写单元测试

    【go语言开发】编写单元测试

    本文主要介绍使用go语言编写单元测试用例,首先介绍如何编写单元测试,然后介绍基本命令的使用,最后给出demo示例 在go语言中编写单元测试时,使用说明 测试文件命名 :在 Go 语言中,测试文件的命名应与被测试的源代码文件相同,但以 “_test” 结尾。例如,如果你的源

    2024年02月04日
    浏览(11)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包