4

最近、バイトコードアウトラインEclipseプラグインをインストールし、テストクラスが

public class Test {
}

java.lang.Objectのコンストラクターを呼び出します

public class Test {
  public <init>()V
   L0
    LINENUMBER 15 L0
    ALOAD 0
    INVOKESPECIAL java/lang/Object.<init>()V
    RETURN
   L1
    LOCALVARIABLE this LTest; L0 L1 0
    MAXSTACK = 1
    MAXLOCALS = 1
}

INVOKESPECIAL java/lang/Object.<init>()Vは、java.lang.Objectのコンストラクターを呼び出すことを意味します

意味がありますか?java.lang.Objectバイトコードによる判断

  public <init>()V
   L0
    LINENUMBER 37 L0
    RETURN
    MAXSTACK = 0
    MAXLOCALS = 1

何もしていません。ただ戻る。

4

2 に答える 2

4

構造上の制約に関する JVM 仕様のセクション 4.9.2を満たすためには、次のようにする必要があります。

クラス Object のコンストラクターから派生したインスタンス初期化メソッドを除く各インスタンス初期化メソッド (§2.9) は、インスタンス メンバーにアクセスする前に、これの別のインスタンス初期化メソッドまたは直接スーパークラス super のインスタンス初期化メソッドのいずれかを呼び出す必要があります。

の直接のサブクラスであるクラスのルールは緩和される可能性Objectがありますが、それが利点をもたらすとは思えず、エレガントではありません(IMO)。Objectコンストラクター将来何らかの初期化を実行した場合はどうなるでしょうか? それをバイパスできる仕様が本当に欲しいですか?

于 2012-12-07T16:26:15.007 に答える
3

Java コンパイラはjava.lang.Object、おそらくより洗練されたデフォルト コンストラクタを持つ他の基本クラスとは異なる扱いをしてはなりません。したがって、基本クラスのコンストラクターは、サブクラスのコンストラクターから実行する必要があります。このバイト コードは、ベース クラス (を含む) の将来の変更に対しても安全ですObject。ある日、誰かがベース クラスを変更した場合、サブクラスのコードは再コンパイルされるべきではありません。

ところで、Object を含む基本クラスの変更はそれほど風変わりなものではありません。インストルメンテーション パッケージについて考えてみてください。JDK をインストルメント化し、たとえば、作成されたすべてのオブジェクトをカウントする場合は、のバイト コードを変更しますjava.lang.ObjectObjectここで、バイト コードにコンストラクターの 呼び出しが含まれていない場合、インストルメント化されたコードは実行されません。

于 2012-12-07T16:28:25.253 に答える