JavaSE进阶(day13,复习自用)

news2024/10/6 9:02:19

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

  • 单元测试
    • 单元测试概述
    • 单元测试快速入门
    • 单元测试常用注解
  • 反射
    • 反射概述
    • 反射获取类对象
    • 反射获取构造器对象
    • 反射获取成员变量对象
    • 反射获取方法对象
    • 反射的作用-绕过编译阶段为集合添加数据
    • 反射的作用-通用框架的底层原理
  • 注解
    • 注解概述
    • 自定义注解
    • 元注解
    • 注解解析
    • 注解的应用场景一:junit框架
  • 动态代理

单元测试

单元测试概述

在这里插入图片描述
在这里插入图片描述
Junit单元测试是做什么的?
测试类中方法的正确性的。
Junit单元测试的优点是什么?
JUnit可以选择执行哪些测试方法,可以一键执行全部测试方法的测试。
JUnit可以生测试报告,如果测试良好则是绿色;如果测试失败,则是红色。
单元测试中的某个方法测试失败了,不会影响其他测试方法的测试。

单元测试快速入门

在这里插入图片描述

单元测试常用注解

在这里插入图片描述
在这里插入图片描述

反射

反射概述

在这里插入图片描述

反射获取类对象

反射的第一步是什么?
获取Class类对象,如此才可以解析类的全部成分
获取Class类的对象的三种方式
方式一:Class c1 = Class.forName(“全类名”);
方式二:Class c2 = 类名.class
方式三:Class c3 = 对象.getClass();

反射获取构造器对象

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
利用反射技术获取构造器对象的方式
getDeclaredConstructors()
getDeclaredConstructor (Class<?>… parameterTypes)
反射得到的构造器可以做什么?
依然是创建对象的
public newInstance(Object… initargs)
如果是非public的构造器,需要打开权限(暴力反射),然后再创建对象
setAccessible(boolean)
反射可以破坏封装性,私有的也可以执行了。

反射获取成员变量对象

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
利用反射技术获取成员变量的方式
获取类中成员变量对象的方法
getDeclaredFields()
getDeclaredField (String name)
反射得到成员变量可以做什么?
依然是在某个对象中取值和赋值。
void set​(Object obj, Object value):
Object get​(Object obj)
如果某成员变量是非public的,需要打开权限(暴力反射),然后再取值、赋值
setAccessible(boolean)

反射获取方法对象

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
利用反射技术获取成员方法对象的方式
获取类中成员方法对象
getDeclaredMethods()
getDeclaredMethod (String name, Class<?>… parameterTypes)
反射得到成员方法可以做什么?
依然是在某个对象中触发该方法执行。
Object invoke​(Object obj, Object… args)
如果某成员方法是非public的,需要打开权限(暴力反射),然后再触发执行
setAccessible(boolean)

反射的作用-绕过编译阶段为集合添加数据

在这里插入图片描述
反射为何可以给约定了泛型的集合存入其他类型的元素?
编译成Class文件进入运行阶段的时候,泛型会自动擦除。
反射是作用在运行时的技术,此时已经不存在泛型了。

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

在这里插入图片描述

public class ReflectDemo {
    public static void main(String[] args) throws Exception {
        //需求:反射实现泛型擦除后,加入其他类型的元素
        ArrayList<String> list1 = new ArrayList<>();
        ArrayList<Integer> list2 = new ArrayList<>();

        System.out.println(list1.getClass());
        System.out.println(list2.getClass());

        System.out.println(list1.getClass() == list2.getClass());//ArrayList.class

        System.out.println("-------------------------------");
        ArrayList<Integer> list3 = new ArrayList<>();


        list3.add(23);
        list3.add(22);
//        list2.add("黑马");
        Class c = list3.getClass();//ArrayList.class ==> public boolean add(E e)
        //定位c类中的 add方法
        Method add = c.getDeclaredMethod("add",Object.class);//方法名和方法的参数
        boolean rs = (boolean)add.invoke(list3,"黑马");
        System.out.println(rs);
        System.out.println(list3);

        //更便捷的方法
        ArrayList list4 = list3;
        list4.add("白马");
        list4.add(false);
        System.out.println(list3);

    }
}

注解

注解概述

在这里插入图片描述
对Java中类、方法、成员变量做标记,然后进行特殊处理,至于到底做何种处理由业务需求来决定。
例如:JUnit框架中,标记了注解@Test的方法就可以被当成测试方法执行,而没有标记的就不能当成测试方法执行。

自定义注解

在这里插入图片描述
特殊属性
value属性,如果只有一个value属性的情况下,使用value属性的时候可以省略value名称不写!!
但是如果有多个属性, 且多个属性没有默认值,那么value名称是不能省略的。

元注解

元注解:注解注解的注解。
元注解有两个:
@Target: 约束自定义注解只能在哪些地方使用,
@Retention:申明注解的生命周期
在这里插入图片描述

注解解析

在这里插入图片描述解析注解的技巧
注解在哪个成分上,我们就先拿哪个成分对象。
比如注解作用成员方法,则要获得该成员方法对应的Method对象,再来拿上面的注解
比如注解作用在类上,则要该类的Class对象,再来拿上面的注解
比如注解作用在成员变量上,则要获得该成员变量对应的Field对象,再来拿上面的注解

注解的应用场景一:junit框架

在这里插入图片描述

public class AnnotationDemo4 {

    @MyTest
    public void test1(){
        System.out.println("===test1===");

    }

    public void test2(){
        System.out.println("===test2===");

    }

    @MyTest
    public void test3(){
        System.out.println("===test3===");

    }

    /*
        启动菜单:有注解的才被调用
     */
    public static void main(String[] args) throws Exception {
        AnnotationDemo4 t = new AnnotationDemo4();
        //a.获取类对象
        Class c = AnnotationDemo4.class;
        //b.提取全部方法
        Method[] methods = c.getDeclaredMethods();
        //c.遍历方法,看是否有MyTest注解,有就跑它
        for (Method method : methods) {
            if(method.isAnnotationPresent(MyTest.class)){
                //跑它
                method.invoke(t);
            }
        }


    }
}

动态代理

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
动态代理的优点
非常的灵活,支持任意接口类型的实现类对象做代理,也可以直接为接本身做代理。
可以为被代理对象的所有方法做代理。
可以在不改变方法源码的情况下,实现对方法功能的增强。
不仅简化了编程工作、提高了软件系统的可扩展性,同时也提高了开发效率。

public interface UserService {
    String login(String loginName,String passWord);
    void deleteUsers();
    String selectUsers();
    void deleteById(int id);
    
}
public class UserServiceimpl implements UserService{
    @Override
    public String login(String loginName, String passWord) {
        String rs = "登录名和密码错误";
        if("admin".equals(loginName)&& "123456".equals(passWord)){
            rs = "登陆成功";
        }
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return rs;

    }

    @Override
    public void deleteUsers() {

        try {
            System.out.println("您正在删除用户数据中。。。。");
            Thread.sleep(2500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }

    @Override
    public String selectUsers() {
        String rs = "查询了10000个用户数据~~~";

        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return rs;
    }

    @Override
    public void deleteById(int id) {

        try {
            System.out.println("根据用户的身份证号码:" + id + "删除了它~~");
            Thread.sleep(1200);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
public class ProxyUtil {
    /*
        通过一个静态方法,为用户对象返回一个代理对象
     */
    public static UserService getProxy(UserService obj){//可以讲这几个UserService用T替代,这样就可以为任意接口的实现类对象做代理
        return (UserService) Proxy.newProxyInstance(obj.getClass().getClassLoader(),
                obj.getClass().getInterfaces(), new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        long startTime = System.currentTimeMillis();

                        //真正触发对象的行为执行的。
                        Object rs = method.invoke(obj,args);

                        long endTime = System.currentTimeMillis();
                        System.out.println(method.getName()+"方法耗时:" + (endTime - startTime) / 1000.0 + "s");
                        return rs;
                    }
                });
    }
}
public class Test {
    public static void main(String[] args) {
        //目标:掌握使用动态代理解决问题,理解使用动态的优势。
        UserService userService = ProxyUtil.getProxy(new UserServiceimpl());
        System.out.println(userService.login("admin", "123456"));
        System.out.println(userService.selectUsers());
        userService.deleteUsers();
        userService.deleteById(9);

    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据在内存中存储的现象

&#x1f929;本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 &#x1f970;内容专栏&#xff1a;这里是《C知识系统分享》专栏&#xff0c;笔者用重金(时间和精力)打造&#xff0c;基础知识一网打尽&#xff0c…

chatgpt赋能python:Python图片合成:背景设计的新方案

Python 图片合成&#xff1a;背景设计的新方案 简介 图像合成是一项艺术性和创新性的工作&#xff0c;它涉及到多个过程&#xff0c;包括图像处理、透明度和滤镜应用。Python 我们可以使用其各种库快速、可靠地进行图像合成。在这篇文章中&#xff0c;我们将介绍如何使用 Pyt…

chatgpt赋能python:Python在线模拟器:让编程变得更加轻松

Python 在线模拟器&#xff1a;让编程变得更加轻松 介绍 Python 在线模拟器是一个非常实用的工具&#xff0c;它可以帮助用户直接在浏览器中测试和运行 Python 代码。在线模拟器的出现简化了编程过程&#xff0c;不需要安装 Python IDE 等软件&#xff0c;只需要有一台连接互…

LSM零知识学习三、插桩原理实现细节(1)

本文内容参考&#xff1a; LSM(Linux Security Modules)框架原理解析_lsm框架_pwl999的博客-CSDN博客 Linux LSM(Linux Security Modules) Hook Technology_weixin_30929011的博客-CSDN博客 特此致谢&#xff01; 一、插桩具体实现 前文介绍了插桩原理&#xff0c;本文来详…

chatgpt赋能python:Python图片大小怎么算?

Python图片大小怎么算&#xff1f; 在Web开发中&#xff0c;经常需要展示图片&#xff0c;但是为了让网页加载速度更快&#xff0c;我们需要对图片进行压缩和优化&#xff0c;其中一个重要的参数就是图片的大小。那么在Python中&#xff0c;如何计算图片大小呢&#xff1f; 图…

包扫描工具实现(详解)

文章目录 前言包扫描实现思路&#xff08;需求分析&#xff09;&#xff1a; 具体实现完整代码 前言 注解在 Java 是一个非常重要的存在&#xff0c;而且它出现的非常频繁。 在一个工程下可能有许多的包或者Jar包&#xff0c;为了结合注解可以准确的定位到一个需要的类上&…

代码随想录算法训练营第四十六天|139.单词拆分

LeetCode139.单词拆分 动态规划五部曲&#xff1a; 1&#xff0c;确定dp数组以及下标的含义&#xff1a; dp[i] : 字符串长度为i的话&#xff0c;dp[i]为true&#xff0c;表示可以拆分为一个或多个在字典中出现的单词。 2&#xff0c;确定递推公式&#xff1a; 如果确定dp[j…

javascript基础二十:说说你对DOM的理解,常见的操作有哪些?

一、DOM 文档对象模型 (DOM) 是 HTML 和 XML 文档的编程接口 它提供了对文档的结构化的表述&#xff0c;并定义了一种方式可以使从程序中对该结构进行访问&#xff0c;从而改变文档的结构&#xff0c;样式和内容 任何 HTML或XML文档都可以用 DOM表示为一个由节点构成的层级结构…

交通物流模型 | Python建模实现动态交通分配优化问题求解

文章目录 效果一览文章概述研究内容程序设计参考资料效果一览 文章概述 交通物流模型 | Pyomo建模框架实现动态交通分配优化问题求解,DTA 交通分配问题通常需要考虑许多因素,例如道路容量、交通需求、速度限制、车辆类型、交通信号灯等,在城市规划和交通管理领域中具有重要的…

分布式系统概念和设计——分布式事务

分布式系统概念和设计 分布式事务 访问多个服务器管理的对象的事务称为分布式事务。 当一个分布式事务结束时&#xff0c;事务的原子特性要求所有参与事务的服务器必须全部提交或全部放弃。 实现&#xff1a; 其中一个服务器承担了协调者的角色&#xff0c;保证在所有的服务器…

chatgpt赋能python:Python图片取模:提高网页加载速度与用户体验

Python图片取模&#xff1a;提高网页加载速度与用户体验 随着互联网的发展与全球化进程的加速&#xff0c;网站的速度与易用性成为用户选择网站的重要因素。在这种情况下&#xff0c;我们需要优化网站的加载速度与用户体验。其中一种优化方法就是使用图片取模。 本文将向您介…

chatgpt赋能python:Python图像处理技术:学习Python,掌握图像处理!

Python图像处理技术&#xff1a;学习Python&#xff0c;掌握图像处理&#xff01; 在当今时代&#xff0c;图像处理已成为现代生活中不可或缺的一部分&#xff0c;从照片、视频到尖端医疗设备中的医学图像&#xff0c;都需要使用图像处理技术。Python图像处理技术是当今广泛使…

2023年淘宝天猫京东618活动时间安排和活动攻略

2023年淘宝天猫京东618活动力度大吗&#xff1f;活动什么时候开始&#xff1f;有什么省钱技巧&#xff1f;让我们来一起看一下&#xff01; 2023年淘宝618活动一览 时间安排 第一波(开门红) 预售时间&#xff1a;5月26日 14:00-5月26日 20:00 定金时间&#xff1a;5月26日 …

快排+归并

&#x1f947;快排 &#x1f380;快排题目 &#x1f3ab;快排代码实现 #include<iostream> using namespace std; const int N100010;//定义一个只读变量 int a[N]{0};//开辟空间&#xff0c;定义全局变量&#xff0c;后来就不用传参了 void quicksort1(int l,int r) {…

(三)多文件云传输框架项目实现(详解)

文章目录 前言《多文件云传输》框架概述简介技术实现框架基本思想 《多文件云传输》框架思考需求分析 《多文件云传输》框架实现数据基础实现技术难点实现 前言 《多文件云传输》框架的实现是本人的一个编程训练项目&#xff0c;为了提升本人的编程能力、JAVA 编程思想&#x…

第二章 数据类型、运算符与表达式

如何打开项目 如何打开已经存在的解决方案&#xff1f; 找到要打开的解决方案目录&#xff0c;进去之后双击后缀为.sln的文件即可打开该解决方案。 或者从最近打开项目中打开&#xff1a; Online Judge使用 OJ简介 在线判题系统&#xff08;Online Judge&#xff0c;缩写OJ…

GIN框架(GOLANG)讲解如何疯速入门

1.初始化项目&#xff1a; 1.初始化项目&#xff1a;go mod init 2.下载gin框架&#xff1a;go get -u github.com/gin-gonic/gin 3.引入&#xff1a;import "github.com/gin-gonic/gin" 注意点&#xff1a; 报错&#xff1a;$GOPATH/go.mod exists but should …

Python可视化分析项目

今天给大家分享一个基于python的django框架结合爬虫以及数据可视化和数据库的项目&#xff0c;该项目总体来说还是挺不错的&#xff0c;下面针对这个项目做具体介绍。 1&#xff1a;项目涉及技术&#xff1a; 项目后端语言&#xff1a;python 项目页面布局展现&#xff1a;前…

代码随想录算法训练营第四十二天|416. 分割等和子集

LeetCode416. 分割等和子集 背包问题&#xff0c;有N件物品和一个最多能背重量为W 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次&#xff0c;求解将哪些物品装入背包里物品价值总和最大。背包问题有多种背包方式&#xff0c;常见…

地理探测器的应用方法

关于地理探测器的使用&#xff0c;网络上有大量的教学视频及资料&#xff0c;既可以用Excel计算&#xff0c;也可以利用R语言计算&#xff0c;本文主要分享利用Excel计算的方法&#xff0c;借鉴了大量的学习资料&#xff0c;记录一下供自己参考&#xff0c;也希望能帮到有需要的…