eclipse JDTのドキュメントを読んでいるときに、このビットが見つかりました。
IMethodBinding.getParameterTypes()
:。。。注:結果には、内部クラスエミュレーションによって導入された合成パラメーターは含まれていません。
JLSで内部クラスエミュレーションへの参照が見つかりません...このエミュレーションが何であるかを知っている人はいますか?例を投げると、同様に役立ちます。:)
eclipse JDTのドキュメントを読んでいるときに、このビットが見つかりました。
IMethodBinding.getParameterTypes()
:。。。注:結果には、内部クラスエミュレーションによって導入された合成パラメーターは含まれていません。
JLSで内部クラスエミュレーションへの参照が見つかりません...このエミュレーションが何であるかを知っている人はいますか?例を投げると、同様に役立ちます。:)
Eclipseのドキュメンテーションライターは用語が少し緩んでいると思います。JLSに関する限り、内部クラスは内部クラスであり、エミュレートする必要はありません。
ただし、内部クラスが一般的なJVMによって実装される方法には少し注意が必要であり、ここで合成コンストラクターパラメーターが方程式に組み込まれます。何が起こっているのかというと、JVMは、ネストされているかどうかに関係なく、同じクラスを実装します。クラスを囲む際に変数を参照するための特別なバイトコードはないため、コンパイラーは、合成属性を介して変数をフェッチするコードを生成します。
詳細については、元のSunJava1.1内部クラス仕様を参照してください。
「内部クラスエミュレーション」は、コンパイラが内部クラスのバイトコードを生成する方法を意味しているのではないかと思います。
仮想マシンレベルでの内部クラスのサポートはありません(少なくともそれらが導入されたとき)。コンパイラは、内部クラスをコンパイルするときに、通常のクラスと同様にバイトコードを生成する必要があります。次に、外部クラスインスタンスへの参照を追加します。
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";
}
}