You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Groovy AST转换中判断嵌套类是否为静态类?

区分静态嵌套类与内部类的正确方法

在ASM中,判断类内部直接定义的成员嵌套类(非局部类/匿名类)是否为静态嵌套类,不能用isStaticClass()方法或staticClass属性——这些是专门针对「静态方法/代码块里的局部类」设计的,完全不匹配你的场景。

正确的做法是检查嵌套类自身的access字段是否包含ACC_STATIC标志:

实现代码示例

// 假设a是Foo$A的ClassNode实例,b是Foo$B的ClassNode实例
boolean isAStatic = (a.access & Opcodes.ACC_STATIC) != 0; // 返回true
boolean isBStatic = (b.access & Opcodes.ACC_STATIC) != 0; // 返回false

原理说明

根据JVM规范,静态嵌套类会被编译器打上ACC_STATIC访问标记;而非静态内部类(需要持有外部类实例才能创建的那种)不会有这个标志,反而会隐含一个指向外部类实例的构造参数。

而你之前用到的staticClass属性,仅用于标记「定义在静态上下文里的局部类」,所以对成员嵌套类来说,这个值永远是false,完全没用。

内容的提问来源于stack exchange,提问作者chrylis -cautiouslyoptimistic-

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 22:20:29