- PR -

Static Method内で、呼出元のクラス名が知りたい

1
投稿者投稿内容
Zero
常連さん
会議室デビュー日: 2003/06/19
投稿数: 35
投稿日時: 2004-11-18 13:46
おせわになります.

Static Method内で、呼出元のクラス名を取得することは出来ないのでしょうか?
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2004-11-18 14:00
引数で渡すのが正統だと思いますが、
裏技としてLog4Jが使っていたやり方の真似があります。すなわち

1.適当な例外をnewする。
2.new下例外のスタックトレース文字列から切り出す、またはStack
TraceElementを使用する。
Wata
ぬし
会議室デビュー日: 2003/05/17
投稿数: 279
投稿日時: 2004-11-18 14:04
staticかどうかに関わらず、javaのバージョンが1.4以上ならば可能です。
new Throwable().getStackTrace()でStackTraceElementが取得できます
のでそこからメソッド名を取得してください。

なお、スタックトレースの取得は若干重たい処理になりますので、繰り返し
のきつい場所などは、パフォーマンスに問題がないか確認したほうがいいか
もしれません。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2004-11-18 14:07
SecurityManager#getClassContextでもクラスなら取得可能です。
StackTraceElementみたいに詳細な内容は取得できないですが、
JDKのバージョンが1.4以前でも使用可能です。
Zero
常連さん
会議室デビュー日: 2003/06/19
投稿数: 35
投稿日時: 2004-11-18 14:30
引用:

かつのりさんの書き込み (2004-11-18 14:07) より:
SecurityManager#getClassContextでもクラスなら取得可能です。
StackTraceElementみたいに詳細な内容は取得できないですが、
JDKのバージョンが1.4以前でも使用可能です。



お世話になります、JDK1.3なので getClassContextを使用しようかと
思いましたが、protectedとなっていて、アクセスすることが出来ません

SecurityManager security = System.getSecurityManager();
Class[] local_Class = security.getClassContext();
この様に使用したいのですが、他のAccess方法があるのでしょうか?
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2004-11-18 14:41
継承しないとだめですよ。

コード:
SecurilyManager s = new SecurilyManager(){
    public Class[] getClassContext(){
        return super.getClassContext();
    }
};

Class[] c = s.getClassContext();



こんな感じのコードでも確かOKだったはず。

あとはリフレクションで無理やり呼び出すって方法もありますね。
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2004-11-18 15:04
お、超裏技ですね。

うーん、セキュリティマネージャの差し替えや、リフレクションによる
メソッドアクセシビリティの変更は、JVMのセキュリティポリシーに
よっては禁止されていることがあるので、可搬性がちょっとないかも。
Webアプリなんかだと厳しいですね。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-11-18 15:29
「なぜ呼び出し元のクラスを知る必要があるのか」をまず書いたほうが有益な回答をもらえる
かもしれませんよ。
1

スキルアップ/キャリアアップ(JOB@IT)