ezerg 发表于 2013-1-14 07:14:12

JAVA 内部类执行 getDeclaredMethods 的陷阱

今天同事用到了 JAVA Class 的 getDeclaredMethods 方法,主要是要得到类声明的字段
问题是每次程序执行都会多得到一个 Field 对象 this$0
原来对于内部类,编译器都自动增加一个 final 类型 Field 对象,它是外部类的一个引用

为了试验内部类编译的实际情况,写了如下测试类:

public class GetFields {      // 内部类class InnerClass {public void getFields() {Field []fields = this.getClass().getDeclaredFields();System.out.println(Arrays.toString(fields));}}// 调用内部类方法public void getFields() {new InnerClass().getFields();}// public static void main(String []args) {GetFields gf = new GetFields();gf.getFields();}}

编译后的代码如下(部分省略):

class innerclass/GetFields$InnerClass {// compiled from: GetFields.java// access flags 0INNERCLASS 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 查看。
页: [1]
查看完整版本: JAVA 内部类执行 getDeclaredMethods 的陷阱