Javaでcallee
メソッド内の処理でそのメソッド自身への参照を簡単に得る方法。Java5.0以降のみですが、JavaScriptで使えるarguments.calleeみたいなのが簡単に実現できます。
...まぁ、Class#getMahod()でとれるっちゃーとれるんですが、これだとメソッド名を指定する必要があります。以下の方法はメソッド名を知らなくても現在のメソッドを取得できるのがメリットかな。
メソッド自身への参照を得る
関数にしました。1.5より、無名クラスからそれを定義したMethodの参照がとれるようになったのでそれを使います。
/** * メソッド自身を取得する。 * @param o メソッド内で作成した無名クラス * @return メソッド自身 */ static Method callee( Object o ) { return o.getClass().getEnclosingMethod(); }
使い方
引数で無名クラスを指定してcallee関数を呼び出すと呼び出したメソッドの参照が返されます。以下はcalleeを使って再帰するサンプルです。
public static void main ( String[] args ) { count(0); } /** * currentが10になるまで再帰する関数。 * @param current */ static void count( int current ) { System.out.println( current ); if ( current >= 10 ) { return ; } else { try { // メソッド自身を取得する。 callee( new Object(){} ).invoke( null, current+1 ); } catch ( Exception e ) { e.printStackTrace(); return; } } }
実行結果です。
0 1 2 3 4 5 6 7 8 9 10
使いみち
- 再帰なら普通にメソッドを呼び出した方が簡単。(JavaScriptみたいに無名関数とかないし。)
- 呼び出されたMathodの参照が欲しいなら、Proxyを使う手もある。(ちょっと大袈裟になってくるけど。)
- もちろん、Class#getMahod()でもいい。メソッド内でメソッド名がわからん、とかないだろうし。
なので、ぶっちゃけあんまり使い道はないかな。
修正 (2007-11-01)
わかりにくかったのでタイトルを変えた。