2017のセッション動画を見ていると、おもしろいコードがありました。contextに関するセッションです。こんな感じのコードです。mainメソッドは僕が追加しています。}}当然実行できます。m_outerprivさて、どんなバイトコードになっていると思いますか?Inner#test()からOuterのメソッドm_outerpriv()への呼び出しはprivateメソッドですしinvokespecialでしょうか?現時点での仕様では違います。invokestaticになります。return}access$000というstaticメソッドを呼び出しています。return}Inner#test()メソッドではOuterのstaticメソッドaccess$000を呼び出します。引数にOuterインスタンスを渡します。access$000ではそのインスタンスを通じてprivateメソッドをinvokespecialで呼び出します。ACC_SYNTHETICです。Specification(JLS)の6.6.1です。constructor.https://docs.oracle.com/javase/specs/jls/se9/html/jls-6.html#jls-6.6.1privateで宣言しているメンバやコンストラクタは、メンバやコンストラクタの宣言を含んでいるトップレベルの型の内部からのアクセスの場合に限って許可される。インナークラスはここでのトップレベルの型ではないため、Outerのprivateメソッドに直接呼び出せません。コンパイラが合成メソッドを生成して、Outerのstaticメソッドから呼び出すという回りくどいことをしています。staticメソッドはOuterのメンバであるため、privateメソッドが呼び出せます。Specificationにも記述があります。D.https://docs.oracle.com/javase/specs/jvms/se9/html/jvms-5.html#jvms-5.4.4フィールドまたはメソッドRにアクセス可能なクラスまたはインタフェースDとは、以下のことが真となる場合のみに限る。Rがprivateでその宣言がDにある。181では、nestしているものからでもprivateなものにアクセスできるようにする、という提案です。2013年には提案が作成されているのですが!まだドラフトで仕様となるにはまだまだかかりそうです(プライオリティもそれほど高くないため)。提案ではstaticメソッドを合成せず、インナークラスのメソッドでは単にアウタークラスのインスタンスを生成してinvokespecialでprivateメソッドをで呼び出すことができるようになります。Controlというものがあります。こ...2018-08-23メソッド参照をRunnable型の変数に代入するこんなことができるのを知りませんでした。関西Javaエンジニアの会の代表/発起人です。JVMやJavaについて書きます。(51)スターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。