一、背景
在看 aop 创建方法1时,代码中第三个判断条件

ClassUtils.isLambdaClass(targetClass)
说 lambda 表达式生成的类是 final,不能被继承,所以强制得用 JDK 动态代理。
这里用例子检查 lambda 生成的类是否是 final 的。
二、代码
public class LamdbaFinalDemo {
public static void main(String[] args) {
Runnable lambda = () -> System.out.println("test");
Class<? extends Runnable> aClass = lambda.getClass();
System.out.println("====");
boolean isFinal = Modifier.isFinal(aClass.getModifiers());
System.out.println("isFinal: " + isFinal);
System.out.println(aClass.getName());
}
}
结果

三、为什么生成的类是 final 的?
为了确保 不可变性和安全性,JVM 会将生成的类标记为 final,防止其他代码继承或修改其行为。
四、在 spring aop 中的判断
由于 Lambda 类无法被继承,Spring AOP 只能对其使用 JDK 动态代理(而非 CGLIB)。
org.springframework.aop.framework.DefaultAopProxyFactory#createAopProxy ↩︎