2

合理的な

いくつかのスーパークラスでより詳細なロギング デバッグ/ロギング出力が必要なため、サブクラス名は実際にはリアルタイム パフォーマンスやアプリケーション ロジックに影響しません。また、これを通常どおり行うのはかなり悪い設計であるという意見もありますが、開発の実行中にこの情報をログに記録することを本当に望んでいます。

質問

以下のような単純なクラス構造があるとします。参照を明示的に渡すことなく、サブクラスの名前をスーパークラスにプルするにはどうすればよいでしょうか?

public abstract AbstractClass {
    private Logger logger = LoggerFactory.getLogger(getClass());

    public AbstractClass() {}

    public void execute(ContextObject context) {
        if (logger.debuggingEnabled()) {
            String invokingClassName = ""; // <-- how do I get this?
            logger.debug("Executing {}", invokingClassName);
        }
        // shared application logic is here...
    }
}

public MyClass extends AbstractClass {
    public MyClass() {}

    @Override
    public void execute(ContextObject context) {
        super.execute(context);
        // application logic...
    }
}

私は以前にスタック トレースの解析を行ったことがありますが、この情報が必要な場合は、この方法を使用する必要があると思います。私のためにこれを行うライブラリまたは適切なコードスニペットを知っている人はいますか?

4

3 に答える 3

8

this.getClass().getName()トリックをしませんか?すなわち:

public void execute(ContextObject context) {
    if (logger.debuggingEnabled()) {
        String invokingClassName = ""; // <-- how do I get this?
        logger.debug("Executing {}", this.getClass().getName());
    }
    // shared application logic is here...
}
于 2009-04-16T06:48:06.777 に答える
6

次の行を実行すると、すでにその情報を取得しています。

private Logger logger = LoggerFactory.getLogger(getClass());

つまり、実際のクラスのカテゴリでログを記録することになります。その情報はすでにログにあるので、それをメソッド含めることはあまり意味がないと思います。executeログ出力形式にカテゴリ名が含まれていることを確認してください。これで問題ありません。

于 2009-04-16T06:53:15.313 に答える
4

クラス名を明示的にログに記録したいのはなぜですか。Log4jはすでにそれを行っています。Logger を定義した方法でうまくいきます。ログファイルを確認してください。

于 2009-04-16T06:51:47.533 に答える