Создание простых модификаций производительности к уже скомпилированной банке?

Вы можете проверить права доступа к файлу, убедиться, что каталог существует, и сделать много проверок или найти библиотеку, которая выполняет всю эту проверку за вас НО (!) не лучший способ проверка попробовать? Если вы проверяете права доступа и изменения файловой системы ... вам придется изменить свой код. Но попытка написать файл ВСЕГДА скажет вам, можете ли вы написать файл.

Ваше решение не должно быть самым элегантным. Это не дешевый жесткий кодированный патч или что-то ужасное. Это просто нормальный код. И это всегда будет работать. Но если вам не нравится видеть эту проверку в коде, просто отделите ее, поместив в класс, единственная цель которой - проверить возможность написания. На самом деле, вы должны поместить его в полезный класс там, где вам нравится элегантность или нет.

Другим решением было бы поместить весь код записи на жесткий диск. И если вы не можете написать, вся часть будет пропущена, и вы дадите отзыв пользователю с сообщением в части catch.

5
задан Ted Graham 22 October 2009 в 13:36
поделиться

3 ответа

Вы смотрели AspectJ ? Это поддерживает аспекты, использующие переплетение байт-кода, и может перехватывать в ранее скомпилированный файл .jar .

2
ответ дан 14 December 2019 в 08:54
поделиться

Вместо того, чтобы смотреть на изменение jar-файла, я бы поискал решение с помощью инструментария байт-кода . Проблема будет заключаться в идентификации тех частей кода, которые вы хотите заключить в .isDebugEnabled () - вам нужно будет идентифицировать объекты, которые используются только для вызовов log4j.

4
ответ дан 14 December 2019 в 08:54
поделиться

Я считаю, что хорошим решением было бы, чтобы код был бы эффективным, как и .

Учтите, что log4j устарел. Его автор сам оставил все как есть, чтобы избежать нарушения совместимости, но создал новый, SLF4J ( http://www.slf4j.org/ ). Он обеспечивает и фасад, и реализацию, в соответствии с различием commons-logging / log4j, но без недостатков каждого ...

Я считаю, что в этом новом средстве ведения журнала вы можете отправлять параметры объекта в журнал, и что уровень оценивается перед преобразованием объектов (в строку или иначе). Идея состоит в том, чтобы использовать строку формата и параметры.


Наш код не использует slf4j, но у нас есть служебные методы, которые делают именно это. Он кодируется примерно следующим образом (по памяти):

    public enum LogLevel {
       FATAL, ERROR, WARNING, INFO, DEBUG;

       public void log(Logger logger, String format, Object... parameters) {
         if (isEnabled(logger)) {
            logImpl(logger, String.format(format, parameters));
         }
       }
       public boolean isEnabled(Logger logger) {
         switch(this) {
           case WARNING : return logger.isWarningEnabled();
           case INFO : return logger.isInfoEnabled();
           case DEBUG : return logger.isDebugEnabled();
           default: return true;
         }
       }
       private void logImpl(Logger logger, String message) {
         switch(this) {
           case WARNING : logger.warn(message);
           // other cases
         }
       }
    }

Он используется как:

     public void myMethod(Object param) {
       LogLevel.WARNING.log(LOGGER, "What is my message ....", "myMethod", param);
     }

UPDATE : Если вам нужно вызвать метод в журнале ...

  • Одна из возможностей - использовать ] toString метод. Это подходит , если ваше ведение журнала является «техническим» , и будет использоваться также при отладке.

  • Если ваше ведение журнала более функциональное (не предназначено для разработчиков), я предлагаю определить интерфейс (в этом случае он функционально исправен, поэтому полезно указать смысл):

     public interface Detailable {// имя также может указывать на ведение журнала?
     Строка getFullDetails ();
    }
    

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

1
ответ дан 14 December 2019 в 08:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: