10

PHPスコープ解決演算子のように静的コンテキストでJAVAの現在のクラスへの「自己」参照を探していますか?

解決策:範囲外ですか?注意、これは静的定義と比較されます 300倍):

static Logger LOG = LoggerFactory.getLogger(new RuntimeException().getStackTrace()[0].getClassName());

昔ながらの方法は次のようになります。

static Logger LOG = LoggerFactory.getLogger(<Classname>.class.getName());

代替案はありますか?ロガー定義を抽象クラスに入れる方法を探しています。ロガーは、それ自体から呼び出されているクラスを判別する必要があります。

4

4 に答える 4

14

少し速い方

static final Logger LOG = LoggerFactory.getLogger(
       Thread.currentThread().getStackTrace()[0].getClassName());

これを 1000 回行うと、Class.class.getName() を使用すると 36 ミリ秒かかり、この方法で 60 ミリ秒かかります。あまり気にしすぎても仕方ないのかもしれません。;)

于 2011-03-11T09:48:23.990 に答える
4

ロガーを継承しないでください。各クラスで logger を宣言するだけです。

しかし、そのような有用な考えをしたくない場合は、静的にしないでください)

于 2011-03-11T09:22:47.950 に答える
1

あなたの質問の2つと大きく異なる選択肢はないと思います。

次のようなヘルパー メソッドを作成できます。

public static String getCallingClassname() {
    return new RuntimeException().getStackTrace()[1].getClassName();
}

その後

static Logger LOG = LoggerFactory.getLogger(Helper.getCallingClassname());

しかし、それは元のバージョンと同じくらい高価です。(FWIW - これらのロガーが何千もある場合を除き、300 倍遅いことはおそらく大きな懸念事項ではありません。これらの各統計は一度だけ初期化されます...)

私の個人的な好みは、「昔ながらの」方法です。

于 2011-03-11T09:46:45.443 に答える