Как добавить метод в существующий класс без замены этого класса?

tl; dr: Как добавить метод в существующий класс, не заменяя этот класс?

Описание:

Когда я запускаю следующую команду в JShell:

public class TestClass {}

выводится следующий вывод:

created class TestClass

Повторное выполнение этой команды дает следующий вывод:

modified class TestClass

Давайте создадим класс с одним методом, как показано ниже:

public class TestClass {
    public static void testMethod1() {
        System.out.println("In testMethod1");
    }      
}

Стоит отметить, что вывод немного отличается от перезаписи предыдущего класса:

replaced class TestClass

Бег testMethod1 заканчивается успешно и In testMethod1 печатается в консоли.

Теперь я хочу добавить новый метод к существующим TestClass без потери testMethod1, Итак, я запускаю следующий фрагмент:

public class TestClass {
    public static void testMethod2() {
        System.out.println("In testMethod2");
    }      
}

...а также testMethod1 потерян, потому что весь TestClass был заменен.

Как я могу добавить новый метод в существующий класс, не перезаписывая его? Что делать, если я написал 10 методов? Должен ли я записывать существующие методы рядом с новым методом, который я хочу добавить в класс? Разве JShell не должен предлагать пользователю заменить класс в форме предупреждения?

Любые советы или помощь приветствуется.

2 ответа

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

Причина, по которой сообщение отличается от замененного или измененного, заключается в том, что JShells использует HotSwap, который может применяться только тогда, когда класс не меняет свою форму, т.е. объявляет те же методы и поля с одинаковыми сигнатурами.

Как я могу добавить новый метод в существующий класс, не перезаписывая его?

Вы можете выполнить это с помощью

/edit

который открывает панель редактирования Jshell, где вы можете добавить новый метод и принять, чтобы обновить определение класса в вашем случае. Команды jshell также иллюстрируют несколько других атрибутов для редактирования нескольких фрагментов, используя их name или же id, Добавляем скриншот как это сделать:

Jshell Edit Pad

Что делать, если я написал 10 методов? Должен ли я записывать существующие методы рядом с новым методом, который я хочу добавить в класс?

Такой вариант использования выглядит скорее для IDE, чем для jshell на основе REPL, и явно упоминается как нецелевая задача в jshell JEP#222: оболочка Java (цикл чтения-Eval-Print)

Из области видимости выходят графические интерфейсы и поддержка отладчика. JShell API предназначен для обеспечения функциональности JShell в IDE и других инструментах, но инструмент jshell не предназначен для IDE.


Разве JShell не должен предлагать пользователю заменить класс в форме предупреждения?

Будет ли второй @Elliot, как упомянуто в комментариях, по- видимому, пока нет. Хотя это звучит интересно, задайте вопрос ИМХО, но его следует в равной степени сопоставить с мыслями о его реализации, а не с падением производительности инструмента. Ответ @Rafael дает подсказку о поддержании таких издержек.

Другие вопросы по тегам