- - PR -
Static Method内で、呼出元のクラス名が知りたい
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2004-11-18 13:46
おせわになります.
Static Method内で、呼出元のクラス名を取得することは出来ないのでしょうか? | ||||
|
投稿日時: 2004-11-18 14:00
引数で渡すのが正統だと思いますが、
裏技としてLog4Jが使っていたやり方の真似があります。すなわち 1.適当な例外をnewする。 2.new下例外のスタックトレース文字列から切り出す、またはStack TraceElementを使用する。 | ||||
|
投稿日時: 2004-11-18 14:04
staticかどうかに関わらず、javaのバージョンが1.4以上ならば可能です。
new Throwable().getStackTrace()でStackTraceElementが取得できます のでそこからメソッド名を取得してください。 なお、スタックトレースの取得は若干重たい処理になりますので、繰り返し のきつい場所などは、パフォーマンスに問題がないか確認したほうがいいか もしれません。 | ||||
|
投稿日時: 2004-11-18 14:07
SecurityManager#getClassContextでもクラスなら取得可能です。
StackTraceElementみたいに詳細な内容は取得できないですが、 JDKのバージョンが1.4以前でも使用可能です。 | ||||
|
投稿日時: 2004-11-18 14:30
お世話になります、JDK1.3なので getClassContextを使用しようかと 思いましたが、protectedとなっていて、アクセスすることが出来ません SecurityManager security = System.getSecurityManager(); Class[] local_Class = security.getClassContext(); この様に使用したいのですが、他のAccess方法があるのでしょうか? | ||||
|
投稿日時: 2004-11-18 14:41
継承しないとだめですよ。
こんな感じのコードでも確かOKだったはず。 あとはリフレクションで無理やり呼び出すって方法もありますね。 | ||||
|
投稿日時: 2004-11-18 15:04
お、超裏技ですね。
うーん、セキュリティマネージャの差し替えや、リフレクションによる メソッドアクセシビリティの変更は、JVMのセキュリティポリシーに よっては禁止されていることがあるので、可搬性がちょっとないかも。 Webアプリなんかだと厳しいですね。 | ||||
|
投稿日時: 2004-11-18 15:29
「なぜ呼び出し元のクラスを知る必要があるのか」をまず書いたほうが有益な回答をもらえる
かもしれませんよ。 |
1