AbstractQueuedSynchronizer(AQS)通过 volatile int state 记录同步状态,使用 CLH 队列(Node 链表)管理等待线程,支持独占和共享两种模式。AQS 采用模板方法,子类仅实现 tryAcquire/tryRelease(独占)或 tryAcquireShared/tryReleaseShared(共享),其余逻辑由 acquire、release 等方法完成。Node 包含线程、前后指针、waitStatus 等字段,waitStatus 取值如 CANCELLED、SIGNAL、CONDITION、PROPAGATE。文中示例 Mutex 通过内部 Sync 类实现独占锁,演示了 tryAcquire、tryRelease、addWaiter、enq 等核心源码流程,说明 AQS 如何将线程加入等待队列并在资源可用时唤醒。

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 中映射;随后指出异常做流程控制的弊端,演示责任链模式如何把校验、安检等步骤串成链式处理;最后简要提及模板方法模式在统一业务流程(如商户请求、签名、http 调用)中的抽象骨架。