谷本 心 in せろ部屋

はてなダイアリーから引っ越してきました

JSR 292 (invoke dynamic) = 高速リフレクション

[BOF-5236]JSR 292 Cook Book
JSR 292(動的なメソッド呼び出し)に関するBOF


JavaOne2009における僕の一つのテーマは、この「JSR 292を把握すること」だったんだけど、
このBoFでは実際のJavaのコード断片などがでてきたおかげで、具体的に理解することができた。


たとえば、こんな感じでメソッドを動的にinvokeする。

MethodHandle getName = LOOKUP.findVirtual(file.getClass(), "getName", MethodType.make(String.class));
getName.<String>invoke(file);

findVirtualの第3引数は可変長引数で、
最初が「戻り値の型」、それ以降を「引数の型」として指定できるようにするらしい。


まだこのAPIは案レベルのようで(でもJSR 292って、リリース済みのJDK7 M3に入ってなかったっけ?)
どのようにアクセスするべきか意見を聞きたい、っていう状態らしい。


ちなみにJSR 292は基本的に「動的言語を動かすため」に存在してるんだけど、
Javaでも、AOPやHOTデプロイみたいなものが、やりやすくなるんじゃないかと思ってる。


実際に、そういう風に思って話を聞いている観客が僕以外にもいたらしく、
Q&Aでは、(他言語ではなう)Javaで使う上でのメリットが話されていた。


そんなQ&Aから得た一つの結論は、
JSR 292は「高速なリフレクションだ」ということ。


そういう意味では、JSR 292を使えばJavassistやBTrace(ASM)なんかの
バイトコードを書き換えツールや、JavaRebelみたいなホットデプロイツールの
パフォーマンス改善が見込めるんじゃないかな。