メソッドの呼び出し元クラスを取得
sun.reflect.Reflection#getCallerClass( int )でメソッドの呼び出し元クラスを取得します。引数でスタックの深さを指定します。
サンプル:
import sun.reflect.Reflection; public class GetCallerClass { public static void main( String[] args ) { new Master().call(); } static class Master { void call () { new Kitten().meow(); } } static class Kitten { void meow () { // 呼び出し元クラス名を得る。 System.out.println( "0 : " + Reflection.getCallerClass( 0 ).getName()); // => Reflection System.out.println( "1 : " + Reflection.getCallerClass( 1 ).getName()); // => Kitten System.out.println( "2 : " + Reflection.getCallerClass( 2 ).getName()); // => Master System.out.println( "3 : " + Reflection.getCallerClass( 3 ).getName()); // => GetCallerClass System.out.println( "4 : " + Reflection.getCallerClass( 4 ).getName()); // エラー } } }
出力:
0 : sun.reflect.Reflection 1 : GetCallerClass$Kitten 2 : GetCallerClass$Master 3 : GetCallerClass Exception in thread "main" java.lang.NullPointerException at GetCallerClass$Kitten.meow(GetCallerClass.java:22) at GetCallerClass$Master.call(GetCallerClass.java:11) at GetCallerClass.main(GetCallerClass.java:6)
ReflectionはJDKに含まれるクラスですが、sun.*のクラスなので仕事で使うと怒られるかもしれません。ご利用は自己責任で。