У меня есть библиотека, которая была изменена, чтобы ввести метод factory для замены конструктора (причины не важны прямо сейчас, в текущем случае это было главным образом для улучшения вывода типа).
Предполагая, что для него есть рефакторинг Eclipse script (так что у меня в значительной степени есть хорошее машиночитаемое описание изменения), есть ли способ применить этот script к проекту, который использует только эту библиотеку (т.е. он имеет только ссылку на скомпилированную версию библиотеки)?
Например, я начинаю с этого простого класса:
public class MyContainer<T> {
private final T content;
public MyContainer(final T content) {
this.content = content;
}
public T getContent() {
return content;
}
}
Теперь я представляю factory (не делая конструктор закрытым, но это не актуально прямо сейчас), метод factory выглядит следующим образом:
public static <T> MyContainer<T> holding(T content) {
return new MyContainer<T>(content);
}
Когда я экспортирую миграцию script, она выглядит так:
<?xml version="1.0" encoding="UTF-8"?>
<session version="1.0">
<refactoring comment="Introduce factory 'holding' in 'scratch.MyContainer' for constructor 'scratch.MyContainer.MyContainer()'
- Original project: 'scratch'
- Original element: 'scratch.MyContainer.MyContainer()'
- Factory name: 'holding'
- Owner class: 'scratch.MyContainer'"
description="Introduce factory for 'MyContainer'"
element1="/src<scratch{MyContainer.java[MyContainer"
flags="589830" id="org.eclipse.jdt.ui.introduce.factory"
input="/src<scratch{MyContainer.java"
name="holding" project="scratch" protect="false"
selection="89 0" version="1.0"/>
</session>
Это должно содержать достаточно информации, чтобы применить рефакторинг к другому проекту, который ссылается (текущая версия) класса через файл jar.
Но попытка применить рефакторинг дает мне эту ошибку:
Рефакторинг "Ввести Factory" (org.eclipse.jdt.ui.introduce.factory) не может быть выполнен, так как его вход "scratch.MyContainer.java" не существует.
Обратите внимание, что он явно упоминает .java
, поэтому он ищет исходный файл и не удовлетворен применением рефакторинга к двоичному типу.
Примечание. Я не хочу исправлять двоичную библиотеку. Я просто хочу, чтобы вызывающие элементы исходного конструктора были преобразованы вместо вызова метода factory.
Примечание 2: Поиск и замена не помогут в моем конкретном случае. Причина в том, что у меня есть два конструктора: один принимает Object
, а другой принимает String
. Они должны отображаться на двух разных методах factory, поэтому мне понадобится функция поиска и замены, чтобы посмотреть информацию о типе аргумента.
Примечание 3: даже способ вручную указать "заменить экземпляры объекта X
на этот конструктор с помощью вызовов этого метода". [/p >
Обновление: на Eclipse bugzilla есть запись bugzilla, которая около добавляет рефакторинг замены invocation. Реализация этой функции может решить мою проблему, если "вызов" включает в себя создание объекта через данный конструктор. К сожалению, за последние несколько лет он не видел активности (хотя это было запланировано на 3,2).