プログラムdeタマゴ

nodamushiの著作物は、文章、画像、プログラムにかかわらず全てUnlicenseです

クラスのFQCNな文字列-別解

id:ttmmrrさんがFQCNな文字列の取得法という実に真っ当なやり方をd:id:ttmmrr:20110220で解説なさっていたので、実はもっと簡単に邪道な方法で取得できるんじゃね?と


FQCNはFully Qualified Class Nameだそうです。はじめてこの単語は知りました。


ちなみに、条件は

  • パッケージ名などが変わると大変なので、"jp.ne.hatena.ttmmrr.Sample01.ACTION"と直接値を指定しない。
  • クラス名は変更されるかもしれないのでSample01.classは使わない。(Eclipseでリネームしろよ、という突っ込みはなしですか?)
  • 記述をなるべく減らしたい。<-New

というわけで、sun.reflect.Reflection.getCallerClass(1)が使えるでしょう。



ま〜、もう「sun」とか出てる時点で邪道だよね。


sun.reflect.Reflection.getCallerClass(int)は関数を呼び出したクラスのClassを取得する関数。引数の値は、取得するクラスが関数スタックのどの位置に詰まれているかを表します。(う〜ん、何か日本語がおかしいな。取得する関数を呼び出しているクラス………なんかちがうなぁ。ニュアンスが伝われば幸いです。)


0だったら関数スタックに一番上に詰まれている関数はsun.reflect.Reflection.getCallerClassになるので、sun.reflect.ReflectionのClassが返ってきます。

1だったら、sun.reflect.Reflection.getCallerClassを呼び出したクラスが返ってきます。その他細かいことはsun.reflect.Reflection
と、いうわけで、こうなります。

package jp.ne.hatena.ttmmrr;

@SuppressWarnings("restriction")
public class Sample01 {
	public static final String ACTION = 
	    sun.reflect.Reflection.getCallerClass(1).getName()
	    +".ACTION";

	public static void main(String[] args) {
		System.out.println(ACTION);
	}
}

実行結果
jp.ne.hatena.ttmmrr.Sample01.ACTION

Eclipse上でReflectionにアクセス権限与えてなかったので@SuppressWarnings("restriction")を指定しています。

以上っ。