单元测试、反射、注解、动态代理

单元测试JUnit

单元测试的目的是针对方法进行测试,

JUnit的两个要点:①必须是公开的,无参数,无返回值的方法 ②测试方法必须使用@Test注解标记

public class JUnitTest {
    @Test
    public void Testusername() {
        way way = new way();
        String rs = way.username("123");
        //JUnit提供的断言
        Assertions.assertEquals("登陆成功",rs);
    }
}

class way {
    public String username(String un) {
        if(un.equals("123")) {
            return "登陆成功";
        }else
            return "登陆失败";
    }
}

反射

反射概述

反射是在运行时获取类的字节码文件对象,然后可以解析类中的全部成分。

反射的关键:得到编译以后的class文件对象。

获取Class对象的方法 说明 Class c1 = Class.forName(包名+类名) Class类中的一个静态方法 Class c2 = 类名.class 直接用类名获得,最方便 Class c3 = 对象.getClass() 实例化后用对象获得

利用反射获取构造器对象

单元测试、反射、注解、动态代理

反射的构造器可以用于创建对象

public class Reflect {
    public static void main(String[] args) throws Exception {
        //1.获取Class对象
        Class c1 = Student.class;
        //2.获取构造器对象
        Constructor student = c1.getDeclaredConstructor();
        //3.利用构造器对象来实例化对象
        Student stu = (Student) student.newInstance();

        //演示私有构造器如何获取
        Class c2 = Student.class;
        //1.有参构造器声明类型
        Constructor student2 = c2.getDeclaredConstructor(String.class,int.class);
        //2.破坏构造器私有性
        student2.setAccessible(true);
        student2.newInstance("jack",18);
    }
}

利用反射获取成员变量对象

单元测试、反射、注解、动态代理
public class Reflect {
    public static void main(String[] args) throws Exception {
        //1.获取Class对象
        Class c1 = Student.class;
        //2.获取Field对象
        Field field = c1.getDeclaredField("age");
        field.setAccessible(true);
        //3.给成员变量赋值
        Student student = new Student();
        field.set(student,18);
        //4.获取成员变量
        int result = (int) field.get(student);
        System.out.println(result);
    }

利用反射获取方法

单元测试、反射、注解、动态代理
public class Reflect {
    public static void main(String[] args) throws Exception {
        //1.获取Class对象
        Class c1 = Student.class;
        //2.获取Method对象
        Method name = c1.getDeclaredMethod("setName", String.class);
        //3.Method.invoke(对象)来调用方法
        Student student = new Student();
        name.invoke(student,"Jack");
    }
}

反射作用:绕过编译为集合添加数据

说明:①编译成Class文件进入运行阶段后,泛型会 自动擦除

​ ②反射是作用在 运行时的技术,此时已经 不存在泛型

public class Reflect {
    public static void main(String[] args) throws Exception {
        ArrayList list = new ArrayList<>();
        list.add(1);
        list.add(2);
        //无法加入String类型的变量
        //list.add("Jack");
        //使用放射来强行加入String(运行时)
        Class d = ArrayList.class;
        Method add = d.getDeclaredMethod("add", Object.class);
        add.invoke(list,"Jack");
        for (Object integer : list) {
            System.out.println(integer);
        }
    }
}
//运行结果:1 2 Jack

反射作用:通用框架的底层原理

说明:①可以在运行时得到一个类的全部成分

​ ②做Java高级框架

​ ③ 可以针对不同的对象,获取他们的信息

注解

对Java中类、方法、成员变量做标记,然后进行特殊处理

自定义注解

单元测试、反射、注解、动态代理

元注解

注解注解的注解(放在注解定义上方)

常见的元注解有两个:

注解 说明 @Target 约束自定义注解只能在哪些地方使用 @Retention 申明注解的生命周期

单元测试、反射、注解、动态代理

注解解析

判断是否存在注解,存在注解就解析出内容

Original: https://www.cnblogs.com/Tayoou/p/16556089.html
Author: Tayoou
Title: 单元测试、反射、注解、动态代理

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/593977/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Java 获取Word中的所有插入和删除修订

    在 Word 文档中启用跟踪更改功能后,会记录文档中的所有编辑行为,例如插入、删除、替换和格式更改。对插入或删除的内容,可通过本文中介绍的方法来获取。 引入Jar 方法1 手动引入…

    Java 2023年5月29日
    0123
  • rabbitmq web管理

    celery突然连接不上rabbitmq server,结果找半天发现是rabbitmq卡的不行。。。 rabbitmq 设置web管理,添加用户 rabbitmqctl list…

    Java 2023年5月30日
    078
  • Spring Boot + Spring Cloud 实现权限管理系统 后端篇(二十四):权限控制(Shiro 注解)

    在线演示 用户名:admin 密码:admin 技术背景 当前,我们基于导航菜单的显示和操作按钮的禁用状态,实现了页面可见性和操作可用性的权限验证,或者叫访问控制。但这仅限于页面的…

    Java 2023年5月30日
    097
  • Spring与Web环境集成

    Spring与Web环境集成 1. ApplicationContext应用上下文获取方式 应用上下文对象是通过 new ClassPathXmlApplicationContex…

    Java 2023年6月5日
    0106
  • Java Iterator(迭代器)小笔记

    Java Iterator(迭代器)不是一个集合,它是一种用于访问集合的方法,可用于迭代 ArrayList和 HashSet 等集合。Iterator 是 Java 迭代器最简单…

    Java 2023年5月29日
    097
  • 防止重复提交解决方案-(基于JAVA注解+AOP切面)

    1、前言 近期在构建项目脚手架时,关于接口幂等性问题,考虑做成独立模块工具放进脚手架中进行通用。如何保证接口幂等性,换句话说就是如何防止接口重复提交。通常,前后端都需要考虑如何实现…

    Java 2023年5月29日
    075
  • q命令-用SQL分析文本文件

    原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。 在Linux上分析文本文件时,一般会使用到grep、sed、awk、sort、uniq等命令,但这些…

    Java 2023年6月7日
    084
  • spring security登录认证流程

    spring security登录认证流程 1、前端携带用户名和面膜发送请求,controller接收到后,调用service的login方法 2、根据传过来的用户名和密码生成Us…

    Java 2023年6月9日
    077
  • linux下安装jdk8

    1、下载jdk8安装包 2、拷贝到指定目录下(比如:/usr/package) 3、解压到安装目录下(比如:/usr/soft/java) tar -zxvf jdk-8u121-…

    Java 2023年6月8日
    084
  • Python 华为云OSS建桶与文件上传下载删除及检索示例

    华为云OSS建桶与文件上传下载删除及检索示例 实践环境 运行环境:Python 3.5.4CentOS Linux release 7.4.1708 (Core)/Win10 需要…

    Java 2023年6月16日
    077
  • Nginx反代服务器基础配置实践案例

    转载自:https://www.bilibili.com/read/cv16149433?spm_id_from=333.999.0.0 方式1: 轮询RR(默认轮询)每个请求按时…

    Java 2023年5月30日
    086
  • 联盟链 Hyperledger Fabric 应用场景

    一、说明 本文主要通过一个例子分享以 Hyperledger Fabric 为代表的联盟链应用场景。 关于 Fabric 的相关概念请先参考文章 《Hyperledger Fabr…

    Java 2023年6月6日
    093
  • JUC锁:核心类AQS源码详解

    1 疑点todo和解疑 2 AbstractQueuedSynchronizer学习总结 2.1 AQS要点总结 2.2 细节分析 2.2.1 插入节点时先更新prev再更新前驱n…

    Java 2023年6月7日
    0122
  • ftp多文件压缩下载

    @GetMapping(value = "/find") public String findfile(String filePath, String file…

    Java 2023年6月9日
    073
  • 程序员你的maven多模块项目如何对外输出为一个构件?

    上图为常见的台式机,程序员,你看了有啥启发? 台式机生产线 我的maven代码工程 xxx 显示器 xxx-web 主机 xxx-app 键盘 xxx-domian 鼠标 xxx-…

    Java 2023年6月8日
    085
  • Redis 学习笔记

    前置准备 $ wget https://download.redis.io/releases/redis-6.2.6.tar.gz $ tar xzf redis-6.2.6.ta…

    Java 2023年6月8日
    071
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球