Как получить имя низшего подкласса из контекста суперкласса в Java? - PullRequest
2 голосов
/ 16 апреля 2009

Rational

Я хотел бы получить более подробные результаты отладки / регистрации в журналах для нескольких суперклассов, чтобы имя подкласса не влияло на производительность в реальном времени или логику приложения. Я также придерживаюсь мнения, что это нормальный дизайн, но я действительно хочу, чтобы эта информация регистрировалась во время разработки.

Вопрос

Предположим, у меня есть простая структура класса, как показано ниже, как мне перетащить имя подкласса в суперкласс без явной передачи ссылки?

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...
    }
}

Я раньше работал с анализом стековых трасс, и я подозреваю, что по этому пути мне придется идти, если мне понадобится эта информация. Кто-нибудь знает библиотеку, которая сделает это для меня, или хороший фрагмент кода?

Ответы [ 3 ]

8 голосов
/ 16 апреля 2009

Разве 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...
}
6 голосов
/ 16 апреля 2009

Вы уже получили эту информацию при выполнении этой строки:

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

Это означает, что вы будете регистрироваться с категорией для фактического класса. Поскольку эта информация уже есть в журнале, я не думаю, что имеет смысл также включать ее в метод execute. Просто убедитесь, что формат вывода вашего журнала включает в себя имя категории, и это должно быть хорошо.

4 голосов
/ 16 апреля 2009

Почему вы хотите записать имя класса явно. Log4j уже делает это. То, как вы определили свой Logger, поможет вам. Проверьте файл журнала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...