Есть ли способ заменить класс другим в Intellij Idea?

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

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

?

Ответ 1

Существует эта функция "migrate" . Щелкните правой кнопкой мыши в любом классе → Refactor → Migrate.

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

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

Ура!

Ответ 2

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

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

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

Ответ 3

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

Скажите, что у вас есть метод

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);
  }

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

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

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

Ответ 4

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

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

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

Удачи.