lambda 表达式生成的类是 final 的

2025/05/27

一、背景

在看 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)。


  1. org.springframework.aop.framework.DefaultAopProxyFactory#createAopProxy ↩︎