如何在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-
相关产品推荐
相关产品推荐

