Использовать динамическое имя класса в закрытой статической конечной переменной класса - PullRequest
0 голосов
/ 05 июля 2019

Рассмотрим и пример, как показано ниже:

public class LoggerTestClass {
    private static final Logger LOGGER = Logger.getLogger(LoggerTestClass.class);
}

В приведенном выше примере параметр, переданный в getLogger метод жестко запрограммирован, т.е. LoggerTestClass.class Теперь каждый раз, когда я меняю имя класса, мне приходится менять getLogger параметр метода.

Любой другой способ, который автоматически выберет имя класса, например, для нестатической переменной мы можем добавить this.getClass()

Ответы [ 3 ]

1 голос
/ 05 июля 2019

Вы можете использовать Ломбок , чтобы достичь его чистым способом. Все, что вам нужно сделать, это поставить @Log поверх вашего класса, и это даст вам log объект для работы. Подробнее здесь

0 голосов
/ 05 июля 2019

Можете ли вы использовать Java 9+? Тогда решение довольно простое:

private static final Logger LOGGER = Logger.getLogger(MethodHandles.lookup().lookupClass());

Как MethodHandles.lookup() создает поиск с использованием класса вызывающего. (через Reflection.getCallerClass(), но Reflection является внутренним API, поэтому вам нужен дополнительный шаг обработки шага поиска метода)

0 голосов
/ 05 июля 2019

Bro, Для вопроса, прежде всего, нам нужно прояснить некоторую концепцию.

В Java, если идентификатор является членом класса и декорирован ключевым словом «static», его значениеРешено на этапе компиляции.

Если добавлено ключевое слово 'final', идентификатор является константой, его значение должно иметь начальное значение, оно объявлено. И значение не может быть изменено во время выполнения Java.

И интересно то, что статическая составляющая объявляется только внутри класса, ее можно назвать 'Classname' + '.', но не имеет связи с контекстом класса. если нет контекста, идентификатор не становится динамическим.

Я думаю, что если позволить идентификатору стать динамическим, есть только два пути:

  1. пусть идентификатор становится переменной. Удалите ключевое слово 'final'. Код выглядит следующим образом:

    class Test {
    
        private static Logger LOGGER;
    
        public Test() {
            LOGGER = Logger.getLogger(getClass().getSimpleName());
        }
    
    }
    

    Достаточно ключевого слова 'private', еслиВы не хотите, чтобы другие классы обращались к нему.

  2. Попробуйте динамический прокси Java.это может изменить класс во время выполнения Java.

Код счастливый ~

Добро пожаловать, чтобы поговорить со мной ~

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