JAVA 内部类执行 getDeclaredMethods 的陷阱
今天同事用到了 JAVA Class 的 getDeclaredMethods 方法,主要是要得到类声明的字段
问题是每次程序执行都会多得到一个 Field 对象 this$0
原来对于内部类,编译器都自动增加一个 final 类型 Field 对象,它是外部类的一个引用
为了试验内部类编译的实际情况,写了如下测试类:
class innerclass/GetFields$InnerClass { // compiled from: GetFields.java // access flags 0 INNERCLASS innerclass/GetFields$InnerClass innerclass/GetFields InnerClass // 注意:编译器自动增加的字段 final Linnerclass/GetFields; this$0 // 构造方法 <init>(Linnerclass/GetFields;)V L0 LINENUMBER 8 L0 ALOAD 0 ALOAD 1 PUTFIELD innerclass/GetFields$InnerClass.this$0 : Linnerclass/GetFields; ALOAD 0 INVOKESPECIAL java/lang/Object.<init>()V RETURN L1 LOCALVARIABLE this Linnerclass/GetFields$InnerClass; L0 L1 0 MAXSTACK = 2 MAXLOCALS = 2 // 省略该方法的代码 public getFields()V}以上代码可以通过 eclipse 插件 BytecodeOutline 查看。