聞こえないJavaエンジニアが適当に書き連ねていく

つらつらとメモしたり日頃の溜まっている想いを吐き出す場所です。

MethodHandleを試したメモ

これは何?

Twitterでこのツィートを見たので、どんなものなのかなと試した自分メモ

試したソース

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 に書かれている例をコピペしただけ。

試してみて

ということだなと。 リフレクションよりはちょっとシンプルに書けそうだったけど、誰かが勝手にメソッド名を変えた時に動かすまで気づけないのは変わらないので ご利用は計画的に、は変わらない。