6

eclipse JDTのドキュメントを読んでいるときに、このビットが見つかりました。

IMethodBinding.getParameterTypes():。。。注:結果には、内部クラスエミュレーションによって導入された合成パラメーターは含まれていません。

JLSで内部クラスエミュレーションへの参照が見つかりません...このエミュレーションが何であるかを知っている人はいますか?例を投げると、同様に役立ちます。:)

4

2 に答える 2

4

Eclipseのドキュメンテーションライターは用語が少し緩んでいると思います。JLSに関する限り、内部クラスは内部クラスであり、エミュレートする必要はありません。

ただし、内部クラスが一般的なJVMによって実装される方法には少し注意が必要であり、ここで合成コンストラクターパラメーターが方程式に組み込まれます。何が起こっているのかというと、JVMは、ネストされているかどうかに関係なく、同じクラスを実装します。クラスを囲む際に変数を参照するための特別なバイトコードはないため、コンパイラーは、合成属性を介して変数をフェッチするコードを生成します。

詳細については、元のSunJava1.1内部クラス仕様を参照してください。

于 2010-12-18T05:12:12.373 に答える
2

「内部クラスエミュレーション」は、コンパイラが内部クラスのバイトコードを生成する方法を意味しているのではないかと思います。
仮想マシンレベルでの内部クラスのサポートはありません(少なくともそれらが導入されたとき)。コンパイラは、内部クラスをコンパイルするときに、通常のクラスと同様にバイトコードを生成する必要があります。次に、外部クラスインスタンスへの参照を追加します。

public class Outer {

    class Inner {
        @Override
        public String toString() {
            return "Inner";
        }
    }
}

Innerクラスは、次のようなものにコンパイルされます。

class Outer$Inner {
    final Outer this$0;  // the instance of the outer class

    Outer$Inner(Outer outer) {
        super();
        this$0 = outer;
    }

    public String toString() {
        return "Inner";
    }
}
于 2010-12-18T10:45:59.807 に答える