можем ли мы внести некоторые изменения в объект, возвращаемый во время выполнения - PullRequest
3 голосов
/ 11 декабря 2010

есть ли возможность внести некоторые изменения в объект во время выполнения.

Моя проблема в том, что у меня есть один класс, который возвращает мне экземпляр logger.и этот класс содержит только один открытый метод, который возвращает регистратор.ниже класс ..

public class LoggerManager {

    public Logger getLogger(String FQCN) {
        Logger logger = Logger.getLogger(FQCN);
            logger.setLevel(Level.INFO);
            return logger;
    }
}

теперь, если я хочу изменить возвращаемый объект во время выполнения,

, что означает, что объект регистратора, который установлен на уровне INFO, я хочу изменитьэто отладка .. во время выполнения программы, только когда этот код вызывается в определенное время ... без изменения кода где-либо ... что-то подобное ...

logger.setLevel(Level.DEBUG);

Могу ли я достичь этого,каким-либо образом ??

, так как этот класс используется повсеместно в моем коде .. около 1000 мест, без изменения кода .... каким-то образом я могу достичь этого ...

Ответы [ 4 ]

2 голосов
/ 11 декабря 2010

Я думаю, что вы спрашиваете, можете ли вы изменить поведение метода getLogger(String) без изменения класса. Простой ответ «нет, ты не можешь».

Есть несколько хитростей, которые вы можете попробовать:

  • Помещение другой версии класса перед текущей в пути к классам приложения перед текущей версией.

  • Использование BCEL или чего-то еще для изменения байт-кодов класса перед загрузкой.

Тем не менее, оба эти фактора сводятся к изменению класса.

Я думаю, что ваш самый простой подход - изменить класс LogManager, чтобы вы могли генерировать регистраторы с различными уровнями. Немного подумав, вы сможете найти решение, которое не окажет существенного влияния на остальную часть вашего кода.

Однако также ничего не стоит, что обычный способ установки уровней ведения журнала - это использование файла конфигурации, а не явные вызовы setLevel в приложении.

1 голос
/ 11 декабря 2010

есть ли возможность внести некоторые изменения в объект во время выполнения

Да, вы можете вносить изменения в Objects, которые возвращаются из вызовов методов.

Трудно понять, что вы хотите сделать. Если вы установите уровень отладки в возвращаемом логгере, он должен быть установлен для всех мест в вашем работающем vm, которые запрашивают Logger с тем же аргументом FQCN

0 голосов
/ 11 декабря 2010

Можно сделать это с помощью АОП, но это довольно сложно.AOP позволяет вам обрабатывать как до, так и после вызова метода.

Я не уверен, почему вам нужно получить более 1000 мест в одном проекте.У вас есть более 1000 классов?Обычно вам нужно вызывать его только один раз за урок.Я также изменил бы код и изменил дизайн этого метода.

0 голосов
/ 11 декабря 2010

Вы можете установить желаемое значение перед вашим вызовом, а затем вернуться к обычному. Классы логирования Somme позволяют это.

I can't be specific here because your didn't say exactly what your Logger class is (Log4j ?).

Этот класс регистратора, кажется, вызывается как статический метод. Поэтому, если у вас есть какие-либо потоки в вашей системе (например, если вы используете Tomcat или фоновый поток), изменение уровня небезопасно (оно будет изменяться как для вас, так и для всех потоков).


Тем не менее, обычным вариантом вашей проблемы не является изменение уровня. Если вы хотите, чтобы журнал отображался, либо:

  1. Войти на уровне, который появляется
  2. Выберите другой регистратор (каждый из них может быть настроен на определенный уровень).
...