【问题标题】:Is Object constructor called when creating an array in Java?在 Java 中创建数组时是否调用了 Object 构造函数?
【发布时间】:2010-10-03 06:12:57
【问题描述】:

在 Java 中,数组就是对象。我的问题是......创建新数组时是否调用了 Object 构造函数?我们想使用这个事实来使用一些额外的字节码来检测对象构造函数,以检查正在构造的数组的长度。这行得通吗?

【问题讨论】:

    标签: java arrays object instrumentation construction


    【解决方案1】:

    我不这么认为,因为你不能派生一个原生数组来覆盖构造函数

    【讨论】:

    • 我不确定我是否理解。你能详细说明一下吗? (我不想覆盖构造函数......我想在那里放置额外的字节码。在每个对象创建时都会调用 Object() 构造函数。由于数组也是一个对象,我希望 Object() 在此也被调用案例)
    【解决方案2】:

    根据JVM spec:“数组是使用一组不同的指令创建和操作的。”因此,虽然数组是对象的实例,但它们的初始化方式与其他对象的初始化方式不同(如果从该链接锚点向上滚动,您可以看到)。

    【讨论】:

    • 看起来在 newarray 之后没有调用构造函数 :-( 谢谢。
    【解决方案3】:

    您可以使用字节码操作将检查放置在创建新数组的位置。

    【讨论】:

    • 您的意思是检测每个类中的每个方法? (我们想避免这种情况。)
    【解决方案4】:

    不。我在 AspectJ 邮件列表中找到了这个:http://dev.eclipse.org/mhonarc/lists/aspectj-users/msg02975.html

    您可能出于某种原因询问数组,但如果可以,为什么不切换到集合类。这将为您提供大量拦截和验证的机会。

    【讨论】:

    • 您好...您的第一行似乎缺少某些内容。
    【解决方案5】:

    就Java语言规范而言,虽然两者都使用new关键字,但Class Instance Creation ExpressionsArray Creation Expressions是不同的表达形式,每一种都有自己的规则。数组创建表达式的描述没有提到调用构造函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-25
      • 1970-01-01
      • 2016-05-26
      • 1970-01-01
      • 1970-01-01
      • 2015-09-19
      • 2020-12-07
      • 2021-01-26
      相关资源
      最近更新 更多