单元测试反射注解

单元测试

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

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

 

Junit单元测试框架 

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

具体步骤 

 Junit框架的常见注解

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)

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

                                              

反射学什么? 

 

获取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);
   }
}

 获取类的构造器

 

/*
获取构造器[下面是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(加菲猫);
    }
}

 获取类的成员变量

 

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

 获取类的成员方法

 

 

/*
获取成员方法[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;
}

反射的作用 

 

注解

元注解

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

 注解解析器

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

如何解析注解 

 

 

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("程序终止");
        }

    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/113984.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端埋点方式

前言&#xff1a; 想要了解用户在系统中所做的操作&#xff0c;从而得出用户在本系统中最常用的模块、在系统中停留的时间。对于了解用户的行为、分析用户的需求有很大的帮助&#xff0c;想实现这种需求可以通过前端埋点的方式。 埋点方式&#xff1a; 1.什么是埋点&#xff1f…

批量发送邮件时怎么使用蜂邮EDM与Outlook?

批量发送邮件时使用蜂邮EDM和Outlook的方法&#xff1f;群发电子邮件的技巧有哪些&#xff1f; 电子邮件仍然是最常用的沟通工具之一&#xff0c;无论是企业还是个人用户&#xff0c;都希望能够高效地一次性将邮件发送给多个收件人。在本文中&#xff0c;将深入探讨蜂邮EDM和O…

无限上下文,多级内存管理!突破ChatGPT等大语言模型上下文限制

目前&#xff0c;ChatGPT、Llama 2、文心一言等主流大语言模型&#xff0c;因技术架构的问题上下文输入一直受到限制&#xff0c;即便是Claude 最多只支持10万token输入&#xff0c;这对于解读上百页报告、书籍、论文来说非常不方便。 为了解决这一难题&#xff0c;加州伯克利…

循环神经网络(RNN)与长短期记忆网络(LSTM)

前言&#xff1a; 通过前面的学习&#xff0c;我们以BP神经网络为基础&#xff0c;认识到了损失函数&#xff0c;激活函数&#xff0c;以及梯度下降法的原理&#xff1b;而后学习了卷积神经网络&#xff0c;知道图像识别是如何实现的。今天这篇文章&#xff0c;讲述的就是计算机…

OSPF复习(2)

目录 一、LSA的头部 二、6种类型的LSA&#xff08;课堂演示&#xff09; 1、type1-LSA&#xff1a;----重要且复杂 2、type2-LSA&#xff1a; 3、type3-LSA&#xff1a; 4、type4-LSA&#xff1a; 5、type5-LSA&#xff1a; 6、type7-LSA&#xff1a; 三、OSPF的网络类…

基于Docker-consul容器服务更新与发现

目录 一、什么是服务注册与发现&#xff1a; 二、Docker-consul介绍&#xff1a; 三、consul的关键特性&#xff1a; 四、consul部署&#xff1a; 1.部署规划&#xff1a; 2.consul服务器部署&#xff1a; 2.1 建立consul服务&#xff1a; 启动consul后默认会监听5个端口&a…

【案例】3D地球(vue+three.js)

需要下载插件 <template><div class"demo"><div id"container" ref"content"></div></div> </template> <script> import * as THREE from three; // import mapJSON from ../map.json; import { Or…

MetaAI提出全新验证链框架CoVE,大模型也可以通过“三省吾身”来缓解幻觉现象

​ 论文名称&#xff1a; Chain-of-Verification Reduces Hallucination in Large Language Models 论文链接&#xff1a; https://arxiv.org/abs/2309.11495 曾子曰&#xff1a;“吾日三省吾身” --出自《论语学而》 时至今日&#xff0c;生成幻觉&#xff08;hallucination&…

【Docker】十分钟完成redis安装,你也可以的!!!

十分钟完成redis安装&#xff0c;你也可以的 前言安装步骤1.创建安装目录2.创建docker-compose.yml3.创建redis.conf文件4.启动容器5.连接redis 总结 前言 本文基于Docker安装redis&#xff0c;首先确保系统安装了docker和docker-compose。 没有使用过docker朋友可以去看看博主…

呼吸灯【FPGA】

晶振50Mhz 1us 等于 计0~49 1ms等于 0~999us 1s等于 0~999ms //led_outalways(posedge FPGA_CLK_50M_b5 or negedge reset_e8) //【死循环】敏感【触发条件&#xff1a;上升沿 clk】【运行副本】if(reset_e81b0)begin //50Mhz晶振&#xff0c; 49_999_999 是 1秒…

LiveMeida视频接入网关

一、产品简介 视频接入网关主要部署在视频存储节点或视频汇聚节点&#xff0c;面向不同用户&#xff0c;主要用于对接不同厂家、不同型号的摄像机设备&#xff0c;获取摄像机视频后&#xff0c;以统一标准的视频格式和传输协议&#xff0c;将视频推送至上层联网/应用平台。可广…

洒洒水阿萨阿萨

1. 多表查询 多表查询(也叫关联查询, 联结查询): 可以用于检索涉及到多个表的数据. 使用关联查询, 可以将两张或多张表中的数据通过某种关系联系在一起, 从而生成需要的结果集.前提条件: 这些一起查询的表之间它们之间一定是有关联关系.# 先熟悉一下三张表: -- 1. 员工表(11个…

R语言使用surveyCV包对NHANES数据(复杂调查加权数据)进行10折交叉验证

美国国家健康与营养调查&#xff08; NHANES, National Health and Nutrition Examination Survey&#xff09;是一项基于人群的横断面调查&#xff0c;旨在收集有关美国家庭人口健康和营养的信息。 地址为&#xff1a;https://wwwn.cdc.gov/nchs/nhanes/Default.aspx 既往咱们…

上海物理、化学高考命题趋势及2024年上海物理、化学高考备考建议

在上海高考时&#xff0c;物理、化学虽然不像语文、英语和数学那样分数高&#xff0c;但是仍然很重要。那么&#xff0c;从这几年的上海物理、化学的高考题目来看&#xff0c;我们互发现什么命题趋势和考题特点呢&#xff1f;如何备考接下来的2024年高考物理和化学呢&#xff1…

vue3视频大小适配浏览器窗口大小

目标&#xff1a;按浏览器窗口的大小&#xff0c;平铺视频&#xff0c;来适配屏幕的大小。 考虑使用 DPlayer.js、video.js、vue-video-player等视频插件&#xff0c;但报了各种各样的错&#xff1b;试过使用 js 对视频进行同比例放大&#xff0c;再判断其与窗口的大小取最小值…

什么是IPA,和RPA有啥区别和联系?

∵ IPA中包含了RPA的“PA”&#xff0c;AI的“I” ∴IPARPAAI&#xff0c;等式成立&#xff01; AI&#xff1a;或人工智能&#xff0c;是一种复杂的计算机技术&#xff0c;旨在模仿人类智能行为和决策的能力。它涵盖了多种技术和方法&#xff0c;包括&#xff1a;机器学习&am…

【基带开发】AD9361 复乘 com_cmpy_a12_b12

IP核 tb_com module tb_com();reg ad9361_l_clk,rst; initial beginad9361_l_clk0;forever #4.545 ad9361_l_clk~ad9361_l_clk; end initial beginrst1;#9.09 rst0; end wire [63 : 0] m_fll_phase_shift_dout; // fll 输出 dout // FLL Phase Shift com_cmpy_a12_b12 FLL_P…

二叉树问题——前/中/后/层遍历问题(递归与栈)

摘要 博文主要介绍二叉树的前/中/后/层遍历(递归与栈)方法 一、前/中/后/层遍历问题 144. 二叉树的前序遍历 145. 二叉树的后序遍历 94. 二叉树的中序遍历 102. 二叉树的层序遍历 103. 二叉树的锯齿形层序遍历 二、二叉树遍历递归解析 // 前序遍历递归LC144_二叉树的前…

springboot+vue基于hive旅游数据的分析与应用【内含源码+文档+部署教程】

博主介绍&#xff1a;✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久&#xff0c;选择我们就是选择放心、选择安心毕业✌ &#x1f345;由于篇幅限制&#xff0c;想要获取完整文章或者源码&#xff0c;或者代做&am…

LeetCode1518 换水问题

题目描述 超市正在促销&#xff0c;你可以用 numExchange 个空水瓶从超市兑换一瓶水。最开始&#xff0c;你一共购入了 numBottles 瓶水。 如果喝掉了水瓶中的水&#xff0c;那么水瓶就会变成空的。 给你两个整数 numBottles 和 numExchange &#xff0c;返回你 最多 可以喝…