当前位置: 首页 > article >正文

【学习总结|DAY023】Java高级技术

大家好,今天我们来聊聊 Java 中的几个高级技术:单元测试、反射、注解和动态代理。这些技术在源码、框架和架构师层面发挥着重要作用,掌握它们能让我们更深入地理解 Java 的底层原理,并提升代码质量和开发效率。

单元测试:保证代码质量

传统单元测试的痛点

  • 依赖 main 方法,无法自动化测试。
  • 测试结果需要手动分析,效率低下。
  • 一个方法测试失败可能影响其他方法。

JUnit 单元测试框架

  • 优点: 灵活、自动化、生成测试报告。
  • 使用步骤: 导入 JUnit 框架,定义测试类和测试方法,使用 @Test 注解标记测试方法,运行测试。

代码案例

import org.junit.Test;
import static org.junit.Assert.*;

public class CalculatorTest {

    @Test
    public void testAdd() {
        assertEquals(5, Calculator.add(2, 3));
    }

    @Test
    public void testSubtract() {
        assertEquals(1, Calculator.subtract(3, 2));
    }
}

反射:深入类内部

反射的概念

  • 以编程方式解剖类的各种成分(成员变量、方法、构造器等)。
  • 学习获取类信息、操作类成分。

反射的步骤

  1. 获取 Class 对象:类名.classClass.forName()对象.getClass()
  2. 获取构造器:Constructor 对象,用于创建对象。
  3. 获取成员变量:Field 对象,用于赋值和取值。
  4. 获取成员方法:Method 对象,用于执行方法。

反射的作用

  • 运行时获取类信息,操作类成分。
  • 破坏封装性,绕过泛型约束。
  • 构建 Java 框架,实现通用功能。

代码案例

public class ReflectionTest {

    public static void main(String[] args) throws Exception {
        Class<?> clazz = Class.forName("Student");
        Constructor<?> constructor = clazz.getConstructor(String.class, int.class, char.class, double.class, String.class);
        Object obj = constructor.newInstance("张三", 18, '男', 180.0, "篮球");
        Method method = clazz.getMethod("getName");
        String name = (String) method.invoke(obj);
        System.out.println(name);
    }
}

注解:为代码添加元数据

注解的概念

  • Java 代码中的特殊标记,用于为类、方法、成员变量等添加元数据。
  • 例如:@Override@Test 等。

自定义注解

  • @interface 关键字定义注解。
  • 可以定义属性,例如:String value()
  • 可以使用元注解 @Target 和 @Retention 限制注解的使用范围和存活周期。

注解的解析

  • 使用 AnnotatedElement 接口提供的方法,例如:getDeclaredAnnotations()getDeclaredAnnotation()isAnnotationPresent()

代码案例

import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyTest {
    String value();
}

public class AnnotationTest {

    @MyTest("这是一个测试方法")
    public void testMethod() {
        System.out.println("执行测试方法");
    }
}

动态代理:增强对象功能

代理的概念

  • 为对象创建代理对象,代理对象可以增强原对象的功能。
  • 例如:添加日志记录、权限控制等。

Java 动态代理

  • java.lang.reflect.Proxy 类提供 newProxyInstance() 方法创建代理对象。
  • 需要指定类加载器、接口和 InvocationHandler 对象。
  • InvocationHandler 对象的 invoke() 方法用于指定代理对象的行为。

代码案例

public interface Star {
    void sing();
    void dance();
}

public class StarProxy implements InvocationHandler {

    private Object target;

    public StarProxy(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("准备话筒,收钱");
        Object result = method.invoke(target, args);
        System.out.println("谢谢观赏,再见");
        return result;
    }
}

public class ProxyTest {

    public static void main(String[] args) {
        Star zhangsan = new ZhangSan();
        Star proxyStar = (Star) Proxy.newProxyInstance(
                ZhangSan.class.getClassLoader(),
                ZhangSan.class.getInterfaces(),
                new StarProxy(zhangsan));
        proxyStar.sing();
        proxyStar.dance();
    }
}

总结

单元测试、反射、注解和动态代理是 Java 中的高级技术,它们在保证代码质量、深入理解类、为代码添加元数据和增强对象功能方面发挥着重要作用。掌握这些技术,能让我们更深入地理解 Java 的底层原理,并提升代码质量和开发效率。


http://www.kler.cn/a/452528.html

相关文章:

  • python+reportlab创建PDF文件
  • 五、Swagger 介绍(Flask+Flasgger的应用)
  • OAuth 2.0
  • 2021-04-08 VSC++: 降序折半查找。
  • 《战神:诸神黄昏》游戏运行时提示找不到gamede.dll文件怎么办?gamede.dll丢失的修复指南
  • 查看php已安装扩展命令
  • SpringBoot统计接口请求耗时
  • Docker 部署 plumelog 最新版本 实现日志采集
  • 【前端必读】如何免费无限使用Cursor:AI编程工具的终极指南!
  • Merry Christmas HTML
  • Redis——缓存击穿
  • NetLimiter使用教程,并掌握其基本的网络管理和流量控制能力
  • 聊一聊 C#线程池 的线程动态注入 (下)
  • Flutter项目兼容鸿蒙Next系统
  • 外包干了27天,技术退步明显。。。。。
  • MyBatis-Plus分页拦截器,源码的重构(重构total总数的计算逻辑)
  • UDP传输层通信协议详解
  • 33 Opencv ShiTomasi角点检测
  • 获取 jakarta.servlet.http.HttpServletRequest请求IP
  • 【stm32can】
  • C# Winform打开和预览PDF,方法一:调用CefSharp包,内嵌浏览器
  • EMS(energy managment system)从0到1
  • 软考架构师笔记-计算机系统组成-1
  • 10. zynq应用开发--camke编译
  • 【每日学点鸿蒙知识】Charles抓包、lock文件处理、WebView组件、NFC相关、CallMethod失败等
  • Spring源码_05_IOC容器启动细节