文章目录Java高级技术了解一、单元测试1. 传统单元测试的问题2. Junit单元测试框架核心优点使用步骤3. 核心小结二、反射Reflection1. 反射的定义2. 反射的核心学习内容3. 第一步获取Class对象的三种方式4. 获取并操作类的各种成分1获取并操作构造器2获取并操作成员变量3获取并操作成员方法5. 反射的作用与应用场景核心作用实战案例简易对象属性保存框架三、注解1. 注解的概述2. 自定义注解定义语法示例3. 元注解1Target2Retention示例4. 注解的解析核心指导思想解析的核心接口5. 注解的实战案例案例1自定义注解并解析案例2简易版Junit框架6. 注解的核心作用四、动态代理1. 代理的核心思想生活类比2. Java动态代理的核心API3. InvocationHandler的核心方法返回值4. 动态代理的实战案例场景实现思路核心好处5. 动态代理的核心价值Java高级技术了解本次Java高级技术学习围绕单元测试、反射、注解、动态代理展开均为源码、框架、架构师层面的核心技术以下是详细内容整理一、单元测试1. 传统单元测试的问题传统在main方法中编写测试代码存在明显缺陷无法实现自动化测试一个方法测试失败可能影响其他方法无测试报告需程序员手动观察测试结果测试方法耦合度高无法单独针对某个方法测试。2. Junit单元测试框架Junit是第三方开源的单元测试框架主流开发工具如IDEA已集成核心针对方法最小功能单元做正确性测试。核心优点可灵活选择单个/全部方法测试支持自动化且测试方法相互独立自动生成测试报告绿色代表测试通过红色代表失败无需手动分析。使用步骤导入Junit框架jar包IDEA集成无需手动导入为业务类定义对应测试类为每个业务方法编写公共、无参、无返回值的测试方法测试方法上声明Test注解在方法内调用被测试的业务方法执行测试右键单个测试方法执行单测右键测试类/模块执行全测。3. 核心小结作用测试类中方法的正确性执行方式单方法右键运行全方法选择类/模块运行结果标识绿色通过红色失败。二、反射Reflection1. 反射的定义加载类并允许以编程的方式解剖类中的各种成分包括成员变量、构造器、成员方法等。2. 反射的核心学习内容加载类获取类的字节码Class对象获取类的构造器Constructor对象获取类的成员变量Field对象获取类的成员方法Method对象。3. 第一步获取Class对象的三种方式反射的入口是获取类的Class对象有三种核心方式直接通过类名获取最常用通过全类名获取需处理异常通过对象实例获取。4. 获取并操作类的各种成分Class类提供了获取类成分的方法分为仅获取public修饰和获取所有存在的成分两类部分成分需通过setAccessible(true)实现暴力反射突破访问权限修饰符的限制。1获取并操作构造器构造器的核心作用初始化对象并返回。Class获取构造器的方法说明获取全部public修饰的构造器获取全部public修饰的构造器获取全部构造器任意修饰符获取全部构造器任意修饰符获取单个public修饰的构造器指定参数类型获取单个public修饰的构造器指定参数类型获取单个构造器任意修饰符指定参数类型获取单个构造器任意修饰符指定参数类型Constructor的操作方法说明调用构造器传入参数创建对象调用构造器传入参数创建对象设置为true开启暴力反射突破访问权限设置为true开启暴力反射突破访问权限2获取并操作成员变量成员变量的核心作用赋值、取值。Class获取成员变量的方法说明获取全部public修饰的成员变量获取全部public修饰的成员变量获取全部成员变量任意修饰符获取全部成员变量任意修饰符获取单个public修饰的成员变量指定变量名获取单个public修饰的成员变量指定变量名获取单个成员变量任意修饰符指定变量名获取单个成员变量任意修饰符指定变量名Field的操作方法说明为指定对象的该变量赋值为指定对象的该变量赋值获取指定对象的该变量值获取指定对象的该变量值开启暴力反射突破访问权限开启暴力反射突破访问权限3获取并操作成员方法成员方法的核心作用执行方法。Class获取成员方法的方法说明获取全部public修饰的成员方法含父类继承的获取全部public修饰的成员方法含父类继承的获取本类全部成员方法任意修饰符不含父类获取本类全部成员方法任意修饰符不含父类获取单个public修饰的方法指定方法名参数类型获取单个public修饰的方法指定方法名参数类型获取单个本类方法任意修饰符指定方法名参数类型获取单个本类方法任意修饰符指定方法名参数类型Method的操作方法说明触发指定对象的该方法执行返回方法执行结果触发指定对象的该方法执行返回方法执行结果开启暴力反射突破访问权限开启暴力反射突破访问权限5. 反射的作用与应用场景核心作用运行时动态获取类的全部成分并操作可以破坏类的封装性暴力反射可以绕过泛型的约束最核心用途开发Java通用框架主流框架如Spring均基于反射设计。实战案例简易对象属性保存框架需求对任意对象将其字段名和对应值保存到文件中。实现步骤定义接收任意对象的方法通过反射获取对象的Class对象再获取全部成员变量遍历成员变量提取对象中该变量的具体值将变量名和值写入文件。三、注解1. 注解的概述定义Java代码中的特殊标记如Override、Test让其他程序根据注解信息决定执行逻辑使用位置可标记在类、构造器、方法、成员变量、参数等位置。2. 自定义注解定义语法publicinterface注解名称{public属性类型 属性名()default默认值;}特殊属性名value若注解只有一个value属性使用时可省略value注解本质一个继承了Annotation接口的接口注解(…)本质是该接口的实现类对象。示例// 自定义注解publicinterfaceMyTest1{Stringaaa();booleanbbb();String[]ccc();}// 使用注解MyTest1(aaa李四,bbbtrue,ccc{Go,Python})publicvoidtest(){}3. 元注解定义注解注解的注解用于约束自定义注解的使用规则核心有两个Target、Retention。1Target作用声明被修饰的注解可使用的位置常用取值ElementType.TYPE类、接口ElementType.FIELD成员变量ElementType.METHOD成员方法ElementType.PARAMETER方法参数ElementType.CONSTRUCTOR构造器ElementType.LOCAL_VARIABLE局部变量。2Retention作用声明注解的保留周期常用取值优先级递增RetentionPolicy.SOURCE仅源码阶段字节码文件中无RetentionPolicy.CLASS默认值保留到字节码文件运行时无RetentionPolicy.RUNTIME开发常用保留到运行阶段可通过反射解析。示例// 约束Test注解仅能标记方法且保留到运行时Retention(RetentionPolicy.RUNTIME)Target({ElementType.METHOD})publicinterfaceTest{}4. 注解的解析定义判断类/方法/变量上是否存在注解并将注解中的属性值解析出来。核心指导思想要解析谁上面的注解先获取谁的对象如解析方法注解先获取Method对象解析类注解先获取Class对象。解析的核心接口Class、Method、Field、Constructor均实现了AnnotatedElement接口拥有解析注解的能力核心方法如下方法说明获取当前对象上的所有注解获取当前对象上的所有注解获取当前对象上指定类型的注解对象获取当前对象上指定类型的注解对象判断当前对象上是否存在指定注解判断当前对象上是否存在指定注解5. 注解的实战案例案例1自定义注解并解析定义注解MyTest4包含String value()、double aaa() default 100、String[] bbb()约束可标记在类和方法保留到运行时定义类Demo在类和其方法test1上标记MyTest4定义测试类AnnotationTest3通过反射获取Demo的Class对象和Method对象解析注解信息。案例2简易版Junit框架需求标记MyTest的方法自动执行未标记的不执行。实现步骤定义自定义注解MyTestTarget(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME)定义若干方法部分标记MyTest通过反射获取类的所有方法遍历判断是否存在MyTest若存在则执行。6. 注解的核心作用对Java代码的各类成分做标记后续程序通过解析注解对标记的成分做特殊处理如Junit中Test标记的方法被当作测试方法执行。四、动态代理1. 代理的核心思想对象将部分职责转移给代理对象原对象专注于核心业务代理对象负责非核心业务如日志、统计、前置准备核心要求代理对象必须拥有与原对象相同的方法通常通过实现同一接口保证。生活类比明星原对象专注于唱歌、跳舞核心业务经纪人代理对象负责准备场地、收钱、对接资源非核心业务二者均实现“明星”接口含唱歌、跳舞方法。2. Java动态代理的核心APIJava通过java.lang.reflect.Proxy类创建动态代理对象核心方法publicstaticObjectnewProxyInstance(ClassLoaderloader,Class?[]interfaces,InvocationHandlerh)方法参数说明ClassLoader loader指定加载生成的代理类的类加载器Class?[] interfaces指定代理对象实现的接口决定代理对象有哪些方法InvocationHandler h指定代理对象的核心逻辑即代理对象执行方法时要做的事情。3. InvocationHandler的核心方法InvocationHandler接口只有一个方法invoke代理对象的所有方法执行都会触发该方法方法定义publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable参数说明Object proxy生成的代理对象本身Method method当前执行的原对象的方法反射的Method对象Object[] args当前执行方法传入的参数返回值原对象方法执行后的返回结果。4. 动态代理的实战案例场景用户管理类包含登录、删除用户、查询用户方法需统计每个方法的执行耗时且不修改原类代码。实现思路定义用户管理接口含登录、删除、查询方法原用户管理类实现该接口创建代理对象实现同一接口在InvocationHandler的invoke方法中编写逻辑记录方法执行开始时间 → 调用原对象方法 → 记录结束时间 → 计算并打印耗时。核心好处无侵入式增强不修改原业务代码通过代理对象实现功能增强符合“开闭原则”。5. 动态代理的核心价值是Java框架的核心底层技术如Spring AOP实现业务代码与非业务代码的解耦让开发人员专注于核心业务开发。