Как заменить метод, возвращающий тип?
Это всего лишь учебный эксперимент для развлечения. Я играю с bytecode
манипуляция.
Я просто бездельничаю для изучения с asm
в java
, Интересно, можно ли заменить возвращаемый тип метода из интерфейса?
Допустим, у меня есть interface
:
interface Modifiable {
Integer a();
}
Должен ли я создать копию класса, загрузить его в class loader
, а затем изменить этот новый интерфейс?
Если бы это было возможно, это изменение было бы доступно во время компиляции? Так сказать, что мой ide
автозаполнение этих новых методов.
6 ответов
Вы не можете изменить тип возвращаемого значения без изменения самого интерфейса.
Я хочу изменить тип возвращаемого значения на Boolean. Это возможно?
Вы можете изменить текст из Integer
в Boolean
,
Вы можете сделать это во время выполнения, но это сделает интерфейс непригодным для использования, если не будут изменены все реализации.
Должен ли я создать копию класса, загрузить ее в загрузчик классов, а затем изменить этот новый интерфейс?
Если хотите, но я не вижу смысла.
Если бы это было возможно, это изменение было бы доступно во время компиляции?
Да, измените слово с Integer на Boolean. Гораздо проще сделать в вашей IDE.
Вы должны изменить сам интерфейс.
Невозможно изменить тип возврата метода во время выполнения.
Во время компиляции вы определенно не можете изменить тип возвращаемого значения метода. А во время выполнения, да, это возможно. Но это не очень хорошая идея. Ниже руководство от asm, может помочь вам
Вы должны либо вернуть замещающий метод / поле при посещении исходного с помощью ClassVisitor, либо сначала удалить исходный метод / поле в ClassVisitor (см. " 1. Как удалить метод / поле?"), И затем добавьте новый метод / поле, вызвав метод посещения на ClassWriter.
Ну, насколько я знаю, это не может быть сделано во время выполнения. но вы можете использовать дженерики, чтобы сделать это.
в вашем примере сделайте это как
interface Modifiable<T> {
T a();
}
где T будет вашим типом.
Проблема, которую я вижу, состоит в том, что тот, кто когда-либо использует Object, реализующий Modifiable, будет ожидать, что Integer будет возвращен при вызове этого метода. Вы нарушаете обещание, данное создателем этого интерфейса.
Конечно, вы можете создать свой собственный класс, который расширяет тип, возвращаемый интерфейсным методом. Я не рекомендую это для чего-то вроде Integer, потому что будет много способов использовать Integer, но это технически возможно.