AQS(AbstractQueuedSynchronizer)通过一个 volatile 的 int state 记录同步状态,并用 CLH 队列(由 Node 链表实现)管理等待线程。它提供独占和共享两种模式,核心方法 acquire/release 与 acquireShared/releaseShared 采用模板模式,分别调用子类实现的 tryAcquire、tryRelease、tryAcquireShared、tryReleaseShared。Node 包含线程、前后指针、waitStatus 等字段,waitStatus 取值如 CANCELLED、SIGNAL、CONDITION、PROPAGATE 用于控制节点的状态和唤醒行为。文章示例实现了基于 AQS 的独占锁 Mutex,展示了 tryAcquire、tryRelease、addWaiter、enq 等关键源码的工作原理,说明了非公平锁的排队与自旋获取过程。

isAssignableFrom()从类层次判断,调用者为父类Class,参数为子类或自身Class,返回是否“父类可以指派给子类”。instanceof从实例层次判断,左侧为对象实例,右侧为其类或父类,返回对象是否是该类型的实例。二者本质相同但使用场景不同:isAssignableFrom用于反射时的类型比较,instanceof用于运行时对象检测。文章通过接口、父类、子类的代码示例演示了两者的调用方式及相应输出,说明了isAssignableFrom判断父类关系、instanceof判断对象的子类关系。

Spring AOP 通过动态代理实现横向切面:当目标对象实现接口时,使用 JDK Proxy 生成代理;若未实现接口,则采用 CGLIB 生成目标类的子类作为代理。代理对象与原实现同级,能够执行相同功能,而无需修改源代码,从而实现 AOP 的横向机制。

RTTI(运行时类型识别)通过获取类对应的 Class 对象,在运行时识别对象类型并获取其接口、父类、方法等信息,获取方式主要是 Class.forName、类字面量 .class 或对象的 getClass()。RTTI 要求目标类在编译时已知,类加载器会在获取 Class 时完成加载和(可选的)初始化。 反射则用于处理编译时完全未知的类型:在运行时根据字符串加载对应的 .class 文件,获取 Class 后可通过 getMethods、getConstructors 等获得 Method、Constructor 对象,从而实例化对象或调用方法。两者的根本区别在于,RTTI 编译期已知类并检查 .class,反射则在运行时才加载并检查 .class。

getField只能获取public字段并包括父类继承的成员;getDeclaredField能够获取本类的所有字段(包括private),但不返回继承来的字段。示例中通过反射读取并修改Person的age(private,需要setAccessible(true))和money(public),验证两者的行为差异。文章还概括了反射的优点——运行时动态获取类、提升灵活性并可配合动态编译——以及缺点——性能较低、不安全且破坏封装。

文章介绍了常用的设计模式及其在业务代码中的实际应用。首先通过文件解析的if‑else示例指出违反开闭原则和单一职责原则,引出策略模式的概念——将不同算法封装为实现统一接口的类,并在Spring容器中以Map方式动态获取,实现扩展无需修改原有代码。随后以订单校验为例,说明异常做流程控制的弊端,提出责任链模式:抽象处理器持有下一个节点并实现各自校验逻辑,利用Spring注入和@Order组装链式调用,提升可维护性和解耦性。最后简要提及模板方法模式在统一流程(如商户请求、签名、HTTP调用)中的框架化作用。整体展示了如何通过设计模式优化代码结构、遵循面向对象原则并提升可扩展性。