Разбор Java-класса для замены

1

Я должен заменить все e.printStackTrace(); с регистратором. Но есть около 2000 классов. Я могу заменить все в Eclipse, но я должен определить Logger для всех классов. Есть ли решения, которые вы советуете?

  • 0
    Вы можете написать свой собственный поиск и заменить с java.it не должно быть слишком сложным.
  • 0
    Но как определить Logger для всех классов. Мы не можем знать, какую линию мы можем определить
Показать ещё 1 комментарий
Теги:
parsing

3 ответа

3
Лучший ответ

Помимо выполнения CTRL + H и нахождения всего e.printStackTrace(); и заменяя их, вы можете использовать альтернативный подход, создав фабрику регистрации.

public class LoggingFactory {
    private static LoggingFactory instance;
    private Map<Class, Logger> loggers;

    public static synchronized LoggingFactory getInstance() {
        if(instance == null) {
            instance = new LoggingFactory();
        }
        return instance;
    }

    public static Logger getLogger(Class clazz) {
        synchronized (clazz) {
            if(getInstance().loggers.get(clazz) == null) {
                getInstance().loggers.put(clazz, Logger.getLogger(clazz.getName()));
            }
            return getInstance().loggers.get(clazz);
        }
    }
}

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

([\w\d]+)\.printStackTrace\(\);

и замените его на

LoggingFactory.getLogger(this.getClass()).error($1);

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


Результатом будет что-то вроде этого

e2.printStackTrace(); становится LoggingFactory.getLogger(this.getClass()).error(e2);

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


редактировать

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

Поэтому, если вы используете log4j, вы можете просто заменить это регулярное выражение и не использовать LoggingFactory:

org.apache.log4j.Logger.getLogger(this.getClass()).error($1);

  • 0
    Я не понял ([\ w \ d] +) \. PrintStackTrace () ;. Но я должен заменить все на e.printStackTrace (); с LoggingFactory.getLogger (this.getClass ()). error (e2);
  • 0
    Спасибо за Ваш ответ
Показать ещё 1 комментарий
0

замените e.printStackTrace(); с com.class.path.to.static.Logger.doLog(e);

0

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

Мой лучший ответ на такие проблемы можно суммировать одним словом: Emacs

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

Для такой проблемы я могу легко увидеть потенциал записи макроса клавиатуры, который делает что-то вроде этого:

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

  1. Искать назад для объявления класса
  2. Сохранить имя базового класса в буфер обмена
  3. Поиск вперед для открытия скобки.
  4. Вставить новую строку.
  5. Вставьте "public static..." вместе с вставкой в буфер обмена.
  6. Измените результирующую строку до тех пор, пока она будет работать во всех случаях.
  7. Сохранить файл.
  8. Перейдите к следующему поисковому запросу.

Прекратите запись макроса. Теперь повторите макрос 999999 раз (он останавливается на конце ввода). Теперь вы определили все свои объекты Logger.

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

Теперь вы сможете выполнить глобальную замену вызовов "printStackTrace()".

Ещё вопросы

Сообщество Overcoder
Наверх
Меню