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]