不是怎么还在转啊...

006-Java高级技术

Java高级技术

单元测试

  • 就是针对最小的功能单元:方法,编写测试代码对其正确性测试
  • 我们之前是如何进行单元测试的?有什么问题?
    • 只能在main方法编写测试代码,去调用其他方法进行测试
    • 无法实现自动化测试,一个方法测试失败,可能影响其他方法的测试
    • 无法得到测试的报告,需要程序员自己去观察测试是否成功

Junit单元测试框架

  • 可以用来对方法进行测试,它是第三方公司开源出来的(很多开发工具已经继承了Junit框架,比如IDEA)

  • 优点

    • 可以灵活的编写测试代码,可以针对某个方法执行测试,也支持一键完成全部方法的自动化测试,且各自独立
    • 不需要程序员去分析测试的结果,会自动生成报告出来
  • 具体步骤

    • 将Junit框架的jar包导入到项目中(注意:IDEA继承了Junit框架,不需要我们自己手工导入了)
    • 为需要测试的业务类,定义对应的测试类,并为每个业务方法,编写对应的测试方法(必须:公共、无参、无返回值)
    • 测试方法上必须声明@Test注解,然后在测试方法中,编写代码调用被测试的业务方法进行测试
    • 开始测试: 选中测试方法,右键选择“Junit运行”,如果测试通过则是绿色如果测试失败,则是红色
  • 示例

    • 工具类

      image-20250811180838268

    • 测试类

      image-20250811181729552

    • 第二个方法测试时,index本应该是6,但实际上,方法获取长度后没有减一,输出后显示是7

    • 解决方法:做断言:断言结果事都与预期一致

      image-20250811182328779

    • 右键Module可以一键运行模块内的所有测试方法

反射(Reflection)

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

    image-20250811182913021

反射学什么

  • 学习获取类的信息、操作它们

  • 步骤

    • 加载类,获取类的字节码:Class对象

      image-20250811183203040

      • 获取Class的三种方式

        • Class c1 = 类名.class
        • 调用Class提供方法:public static Class forName(String package);
        • Object提供的方法public Class getClass(); Class c3 = 对象.getClass();

        image-20250811183855536

    • 获取类的构造器Constructor对象

    • 获取类的成员变量:Field对象

    • 获取类的成员方法:Method对象

反射获取类中的成分并操作

image-20250811203046397


image-20250811203122003


image-20250811203200367

  • 示例

    image-20250811203915386

    image-20250811204117672

  • 获取构造器的作用依旧是创建对象

    • 暴力反射:暴力反射可以访问私有的构造器、方法、属性

      image-20250811204608710

  • 反射可以理解为:反射是类找程序员,new是程序员找类

  • 获取到成员变量的工作:依然是赋值、取值

    image-20250811205138740

  • 成员方法的作用:依然是执行

    image-20250811205359414

反射的作用

  • 反射的作用

    • 基本作用:可以得到一个类的全部成分然后操作
    • 可以破坏封装性
    • 可以绕过泛型的约束
    • 最重要的用途是:适合做Java的框架,基本上,主流的框架都会基于反射设计出一些通用的功能
  • 反射设计简易框架示例

    image-20250812182243374

    • 只有反射得到Class对象才能知道对象有多少字段

      框架

      image-20250812183207188

      调用:

      image-20250812183323558

      结果:

      image-20250812183247653

注解

  • 注解概述

    • 就是Java代码里的特殊标记,比如:@Override @Test 等,作用是:让其他程序根据注解信息来决定怎么执行该程序

    • 注意:注解可以用在类上、构造器上、方法上、成员变量上、参数上,等位置处

      image-20250812183719647

自定义注解

  • 就是自己定义注解

    image-20250812184205124

  • IDEA创建类时可以像创建接口一样直接选择创建注解(选Annotation)

  • 注意定义属性时要加括号,和类不同

  • 示例1:

    image-20250812184540301

  • 特殊属性名:value

    • 如果注解中只有一个value属性,没有其他非默认属性,使用注解时,value名称可以不写

      image-20250812184633084

      image-20250812184720337

注解的原理

image-20250812184821431

  • 注解本质十一个接口,Java中所有注解都是继承了Annotation接口的
  • @注解(...) :其实就是一个实现类对象,实现了该注解以及Annotation接口

元注解

  • 值得是:注解注解的注解

    image-20250812185212341

    • 比如这里上面两个元注解是用来注解Test这个注解的注解

    • 这两个注解的作用:

      image-20250812185525894

      • 加逗号可以标注多个位置可用

      image-20250812185828569

      • 一般用的是RUNTIME,保留到运行时
    • 示例

      image-20250812185752112

注解的解析

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

  • 如何解析注解?

    • 指导思想:要解析谁上面的注解,就改先拿到谁

    • 比如要解析类上面的注解,则应该先获取该类的Class对象,在过Class对象解析上面的注解

    • 比如要解析成员方法上的注解,则应该获取到该成员方法的Method对象,再通过Method 对象解析其上面的注解

    • Class、Method、Field、Constructor,都实现了AnnotatedElement接口,它们都拥有解析注解的能力

      image-20250812190436176

  • 示例

    image-20250812191237970

    image-20250812191247351

    image-20250812191311358

    image-20250812191556768

作用、应用场景

  • 注意:反射属于公用技术,支持泛型,但不建议加泛型(尖括号)

  • 示例:自定义测试注解

    image-20250812192540047

    • 注解内属性的作用:例如自定义测试注解,可以定义一个属性记录这个方法要测试几次

代理

代理是什么

image-20250813180825563

  • 对象如果嫌身上干的事太多的话,可以通过代理来转移部分责任

  • 对象有什么方法想被代理,代理就一定要有对应的方法

  • 终结如何知道要派有唱歌、跳舞方法的代理呢?

    • 接口
  • 如何实现?

    • 定义接口,代理和被代理的都要实现接口
  • 如何为Java对象创建一个代理对象?

    • java.lang.reflect.Proxy类:提供了为对象产生代理对象的方法

      image-20250813181459103

    • 可以创建一个代理工具类用来创建代理时使用

    • 使用时三个参数基本都是固定的,见下面示例

  • 示例

    • StarService接口

      image-20250813181811872

    • Star类实现StarService接口

      image-20250813181939992

    • 创建代理工具类

      • 搭建框架

        image-20250813182300611

      • 填充内容

        image-20250813182901936

    • 主进程里创建代理对象

      image-20250813182953587

    • 流程

      image-20250813183115508

代理用在什么地方

  • 示例

    image-20250813183335746

  • 增删改查和登录等功能都要统计该操作耗时,可以使用代理减少重复代码

    image-20250813184117273

    image-20250813184324903

AOP切面编程简谈

  • 使用代理的例子就使用了切面编程的思想
    • 在调用方法时,代理在代理方法的上下分别执行了一部分代码,在中间执行了方法中的代码
posted @ 2025-08-13 18:50  Quirkygbl  阅读(1)  评论(0)    收藏  举报