別の質問に対するこの回答は、リフレクションを介して匿名クラスを見つけるための回避策として、すべての名前を単純に試し、...$1
それ以上見つからなくなるまでカウントアップすることを示唆しています。これはすべての内部クラスを見つけることが保証されていますか、それとも0から始まる場合や、(何らかの理由で)一部の数値が省略されている場合がありますか?
3 に答える
JLS 13.1では、次のように指定されています。
クラスまたはインターフェイスは、次の制約を満たす必要があるバイナリ名で命名する必要があります。
- トップレベルの型 (§7.6) のバイナリ名は、その正規名 (§6.7) です。
- [...]
- 匿名クラス (§15.9.5) のバイナリ名は、すぐ外側の型のバイナリ名、$、空でない一連の数字で構成されます。
したがって、理論的には、1 から開始する必要はありませんがEnclosingClass$N
、N が数値であるようなものでなければなりません。
この答えによると:
匿名の内部クラスを保持するファイルの正確な名前は標準化されておらず、異なる場合があることに注意してください。しかし、実際には、ここで説明したもの以外のスキームはまだ見たことがありません。
ですから、そのような保証はないと思います。
java.sun.comチュートリアルへのこのリンクでは、243 ページからの匿名クラスについて、説明されている命名規則に従う出力例とともに説明しています。たとえば、*$1.class、*$2.class などです。246 ページの上部には、
実行時の無名クラスの名前もプログラム出力に表示されます。これらは、それぞれのクラス ファイルを指定するために使用される名前でもあります。結局のところ、匿名クラスはそれほど匿名ではありません。
このチュートリアルが Oracle の Web サイトにあることを考えると、これが変わることのない規則であることはほぼ確実です。お役に立てれば :)