10

私のJavaはさびているので、ご容赦ください。CI でできること:

int someFunc(void)
{
  printf("I'm in %s\n", __func__);
}

Java では、現在定義されている型の名前またはクラスに語彙的に取得できますか。たとえば、私が持っている場合:

import org.apache.log4j.Logger;

class myClass {
    private static final Logger logger = Logger.getLogger(myClass.class);
...
}

getLogger() 引数で「myClass」を繰り返すのは間違っているようです。「getLogger(__CLASS__)」または「getLogger(this.class)」などが必要です。(どちらもばかげていることはわかっていますが、私が探しているものを指している必要があります。) Java コンパイラは、ソースを処理するときに自分がどのクラスにいるのか本当に知らないのでしょうか?

4

3 に答える 3

8

残念ながら、staticコンテキスト内にいる場合 (ここにいるように)、これより簡単な方法はありません。ロガーがインスタンス変数の場合、 を使用できますがgetClass()、サブクラスについて心配する必要があります。

この特定のケースでは、代わりにlog5jを使用することもできます。log5j は log4j のラッパーでありgetLogger()、スタックをたどって正しいクラスを推測する などの便利なメソッドを備えています。したがって、コードは次のようになります。

import com.spinn3r.log5j.Logger;
class myClass {
    private static final Logger logger = Logger.getLogger();
    ...
}

また、同じ宣言をコピーしてすべてのクラスに問題なく貼り付けることができます。

于 2009-07-02T18:37:30.100 に答える
7

私は抵抗できませんでした。

mmyers が参照するものの実装は次のとおりですが、自家製です:)

基本的に、例外をスローし、スタックの 2 番目の要素を取得してクラス名を取得します。

私はまだそれをインスタンスメンバーとして持っている方が良いと思います。

:)

package some.utility.packagename;   
import java.util.logging.Logger;

import some.other.packagename.MyClass;

public class LoggerFactory {
    public static Logger getLogger() {
        StackTraceElement [] s = new RuntimeException().getStackTrace();
        return Logger.getLogger( s[1].getClassName() );
    }
    public static void main (String [] args) {
        MyClass a = new MyClass();
    }
}

使用法:

package some.other.packagename;
import java.util.logging.Logger;

import static some.utility.packagename.LoggerFactory.getLogger;

public class MyClass {

    private static final Logger logger = getLogger();
    static{
         System.out.println(MyClass.logger.getName());
    }

}
于 2009-07-02T19:11:56.320 に答える
4
StackTraceElement[] trace = Thread.currentThread().getStackTrace();
return trace[2].getClassName();

私見スタックトレースを取得するためのよりきちんとした方法

于 2010-12-09T11:55:56.933 に答える