`
ezerg
  • 浏览: 273500 次
  • 性别: Icon_minigender_1
  • 来自: 石家庄
社区版块
存档分类
最新评论

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 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 查看。



0
0
分享到:
评论

相关推荐

    反射私有内部类的例子

    ### 反射私有内部类的例子 #### 一、引言 在Java编程语言中,反射(Reflection)是一项强大的功能,允许程序在运行时检查和修改自身结构与行为。通过反射,可以动态地获取类的信息并操作其字段、方法以及构造器等。...

    JAVA读取同一路径下所有类及其方法

    JAVA读取同一路径下所有类及其方法 在 Java 中,获取同一路径下所有类及其方法是非常重要的,这样才能对权限进行控制。在本文中,我们将提供一种获取所有类及其方法的方法。 获取同一路径下所有类及其方法 在开发...

    java的类反射

    Java的类反射是Java语言中一个强大的特性,它允许程序在运行时检查并操作类、接口、字段和方法的信息。这种动态类型的能力使得Java代码能够更加灵活,可以处理未知类型的对象,实现元编程,以及在运行时创建和访问类...

    Java零基础 - Java的加载与执行原理剖析.md

    - **初始化**:这是类加载过程的最后一步,它执行类的初始化代码,包括静态代码块和变量的赋值操作。 #### 四、字节码解释和执行 - **字节码**:字节码是一种中间格式的二进制代码,它包含了Java程序的指令、操作...

    JAVA反射机制的入门代码

    Java反射机制是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个特性使得Java具有了高度的灵活性和动态性,尤其是在处理元数据、创建对象、调用私有方法...

    Java 自省类教程

    - **兼容性**:由于自省涉及到类的内部细节,因此在不同版本的JVM上可能会有不同的表现。 #### 五、总结 自省是Java语言的一个强大特性,为开发者提供了极大的灵活性。然而,正如文中所强调的那样,应当根据实际...

    java 通过反射获取类上注解,方法上注解,注解里的值及方法参数

    反射(Reflection)是Java的一个强大特性,允许程序在运行时检查类、接口、字段和方法等信息。本教程将深入探讨如何通过反射获取类、方法上的注解以及注解中的值和方法参数。 1. **注解的定义与使用** 注解以`@`...

    java反射,获取所有属性、方法以及List集合类

    Java反射是Java编程语言中的一个强大工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射主要用于在运行时分析类和对象,包括访问私有成员、调用私有方法、创建对象、获取类...

    java反射实例

    4. **获取方法(Methods)**:`getMethods()`获取类的所有公共方法,包括继承的方法,而`getDeclaredMethods()`仅获取类自身声明的方法。`Method`对象可以用于在运行时动态调用方法,使用`invoke()`方法。 5. **...

    Java中类的反射机制

    Java中的反射机制是Java语言的一项强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制主要通过java.lang.Class类和相关的类库来实现,它使得我们能够在运行时动态...

    java反射机制学习(四):通过反射执行方法、操作属性、操作数组中的数据

    一旦获得`Class`对象,我们可以通过`getDeclaredMethods()`方法获取类的所有声明的方法,然后通过`invoke()`方法来执行指定对象上的某个方法。例如: ```java Class&lt;?&gt; clazz = Class.forName(...

    博客《 夯实JAVA基本之二 —— 反射(3):类内部信息获取》对应源码

    这篇博客《夯实JAVA基本之二 —— 反射(3):类内部信息获取》深入探讨了如何通过反射机制获取Java类的内部信息。在Android开发中,反射的应用尤为广泛,例如动态加载类、处理注解、适配不同设备等场景。 首先,要...

    java反射获取所有属性,获取所有get方法,包括子类父类

    Java反射是Java编程语言中的一个强大工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射主要用于在运行时分析类和对象,包括访问私有成员、调用私有方法、创建动态代理等。...

    java简单方法顺序调用注解

    标题中的“java简单方法顺序调用注解”是指使用注解来控制类中方法的执行顺序。这在某些场景下非常有用,比如初始化逻辑、测试脚本或者需要特定顺序执行的任务。下面我们将深入探讨如何实现这一功能。 首先,我们...

    java例子 java反射

    Java反射是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类是`java.lang.Class`,它代表了类的信息。当我们需要在运行时动态地...

    650.648.JAVA基础教程_反射-获取运行时类的属性结构及其内部结构(650).rar

    Java反射是Java编程语言中的一个强大特性,它允许程序在运行时检查类、接口、字段和方法...本教程的650.648.JAVA基础教程将详细讲解如何利用反射获取运行时类的属性结构及其内部结构,帮助你更好地理解和运用这一特性。

    java reflection in action

    Java反射是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在《Java Reflection in Action》这本书中,作者深入探讨了这一主题,帮助开发者理解并有效地利用...

    Java反射机制总结

    反射机制为Java程序员提供了一种强大的工具,使得程序能够在运行时动态地获取类的信息,并且能够直接操作程序的内部结构。这种能力使得Java程序更加灵活,能够根据运行时的环境变化而调整自己的行为。 #### Java...

    java中反射的概念

    总的来说,Java反射机制是面向对象编程的一个重要补充,它扩展了Java程序的动态性,允许程序员在运行时访问和操作类的内部结构,增强了代码的灵活性。理解和熟练掌握反射技术,对于提升Java编程能力,尤其是处理复杂...

Global site tag (gtag.js) - Google Analytics