Есть ли способ заменить класс другим в Intellij Idea? - PullRequest
11 голосов
/ 28 октября 2011

Ребята, вот моя проблема: у меня есть класс, который используется во многих местах в моем проекте. И я должен заменить этот класс другим из предоставленных jar. Есть ли способы реорганизовать это? Я полагаю, что это простая проблема, но я не знаю, как ее решить.

Речь идет не о замене исходного кода - я хочу заменить все использования классов по классам из моей библиотеки и иметь возможность полностью удалить свой собственный класс. Представьте, что я создал свой собственный StringUtils и обнаружил, что есть библиотека Apache.common StringUtils, и теперь я хочу использовать ее везде в своем коде. И подписи методов класса не проблема: они совпадают.

Ответы [ 4 ]

21 голосов
/ 06 октября 2015

Имеется эта функция "миграции" .Щелкните правой кнопкой мыши в любом классе -> Refactor -> Migrate.

Немного раздражает, что вам нужно создать новый набор миграции, и вы не можете запустить его с нуля.Но он делает именно то, что вам нужно.

Вы выбираете класс или пакет для переноса и сообщаете ему, на какой класс или пакет он должен измениться.Нажмите Run и все использования будут переписаны.Тогда вы можете удалить старый класс, потому что он не будет использоваться.

Ура!

3 голосов
/ 28 октября 2011

Если вы используете статические методы (как показано в примере StringUtils), делегируйте новый класс в вашей предыдущей реализации, например

public static String myOldMethod(String argument) {
    return MyNewClass.myNewMethod(argument);
}

, затем выберите Refactor-> Inline и выберите «Все вызовы и удалитеметод »в диалоге параметров.Таким образом, вы можете справиться с изменениями имени метода и порядком изменений аргументов.

1 голос
/ 28 октября 2011

Самый простой способ - написать метод, отображающий то, что вы хотите встроить.

Допустим, у вас есть метод

enum MyStringUtils {
  public static boolean containsAnyCase(String searchFor, String searchIn) {
      // something
  }
}

// calling code
boolean found = MyStringUtils.containsAnyCase(find, in);

Вы хотите использовать StringUtils.containsIgnoreCase, однако имя класса, имя метода и порядок аргументов различаются.

Таким образом, вы меняете тело метода для вызова нужного метода.

  public static boolean containsAnyCase(String searchFor, String searchIn) {
      return StringUtils.containsIgnoreCase(searchIn, searchFor);
  }

Выберите метод и + + N. Это предложит встроить этот метод везде и удалит ваш метод.Ваш вызывающий теперь выглядит как

  boolean found = StringUtils.containsIgnoreCase(in, find);

Это будет работать, даже если исходный класс использует import класса, import static метода или не импортирует вообще.

0 голосов
/ 28 октября 2011

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

Итак, это зависит от того, как вы запускаете ваше приложение.Например, если вы используете командную строку, например java -cp lib.jar;myapp.jar com.mycompany.Main, и оба файла lib.jar и myapp.jar содержат один и тот же класс Util, будет использоваться версия lib.jar.

Если вы хотите добиться того же эффекта при запуске из IDE, попробуйте проверить свойства проекта.Возможно, вы можете контролировать порядок библиотечных банок относительно классов вашего проекта?Если нет, то, вероятно, вы можете добавить jar-файлы в путь начальной загрузки.В этом случае добавьте ваш lib.jar в путь начальной загрузки класса (просто для работы в вашей IDE).

Удачи.

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