これは何?
Twitterでこのツィートを見たので、どんなものなのかなと試した自分メモ
リフレクションは今後MethodHandleに置き換わっていくと思いますよ。リフレクションだとアクセスチェックが実行時に行われますが、MethodHandleだとMethodHandleの生成時にチェックできますし。 https://t.co/dalSnsmGg6
— Yuichi Sakuraba (@skrb) February 5, 2019
試したソース
import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; public class MethodHandlerTest { public static void main(String... args) { Object x, y; String s; int i; MethodType mt; MethodHandle mh; MethodHandles.Lookup lookup = MethodHandles.lookup(); // mt is (char,char)String mt = MethodType.methodType(String.class, char.class, char.class); try { // mh = lookup.findVirtual(String.class, "replace", mt); // 存在しないメソッドを書いたらどうなるか?⇒コンパイル時は検知してくれない mh = lookup.findVirtual(String.class, "aaa", mt); s = (String) mh.invokeExact("daddy",'d','n'); System.out.println(s); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (Throwable throwable) { throwable.printStackTrace(); } } }
docs.oracle.com に書かれている例をコピペしただけ。
試してみて
JavaのRumtime-Reflectionで厳しいの、後の改修で変更が入った時に静的な検出ができない点にあるので、MethodHandleに置き換わっても厳しさは変わらない印象ありますね。というかMethodHandle自体はリフレクションの手段の一つであってそれを動的に使うか静的に使うかは関知しなさそう https://t.co/rseoSDOmAW
— がくぞ (@gakuzzzz) February 5, 2019
ということだなと。 リフレクションよりはちょっとシンプルに書けそうだったけど、誰かが勝手にメソッド名を変えた時に動かすまで気づけないのは変わらないので ご利用は計画的に、は変わらない。