Добавление метода в объект класса Java

202
25 декабря 2018, 06:30

Возможно ли в Java добавление экземпляру класса метода непрописанного в классе?

Например:
Есть класс HumanHero и его экземпляр Hercules.
Изначально наш герой не может летать, но вот, случается чудо и, по стечению обстоятельств и личному благоволению Зевса, наш герой отращивает себе крылья и получает данную способность.

Вопрос:
Есть ли возможность добавить экземпляру класса HumanHero метод fLy(), если при создании класса, данный метод там не был прописан?

Answer 1

Вы не совсем верно представляете себе принципы ООП, согласно им свойства/методы имеет не экземпляр класса, а класс. Если вы хотите, чтобы один класс имел другие свойства/методы относительно другого класса это решается на уровне иерархии классов. В вашем примере это бы выглядело так:

abstract class HumanHero {
   public abstract void fly();
}
class Prometheus extends HumanHero {
   public void fly() { System.out.println("No, I can't fly"); }
}
class Hercules extends HumanHero {
   public void fly() { System.out.println("Flying is awesome!"); }
}

Нет, ну можно конечно нагородить другую конструкцию в более традиционном не в ООП стиле:

class HumanHero {
   private boolean canFly=false;
   public void fly() {
       if(canFly)
         System.out.println("Flying is awesome!");
       else
         System.out.println("No, I can't fly");
   }
   public void setCanFly(boolean canFly) {
      this.canFly=canFly;
   }
}

Фактически это означает, что Зевс должен заранее при проектировании понимать, какие методы и свойства могут иметь его герои.

Нет, ну можно конечно придумывать разные хаки, например можно генерировать исходники компилировать их на лету через JavaCompiler загружая через ClassLoader или сделать некий метод, к которому цеплять в зависимости от пожеланий Зевса некие парсируемые инструкции и т.д. - но это все хаки.

Answer 2

Экземпляры и методы класса хранятся в различных областях памяти. Экземпляры хранятся в "куче" и содержат только данные для каждого экземпляра отдельно, тогда как методы связаны с классом, хранятся в "Method Area" один раз.

Создавая новый экземпляр вы получаете в куче новое место под данные, но не новый список методов в "Method Area".

По этой причине добавить метод непосредственно экземпляру нельзя. Инструкция, содержащая ссылку на новый метод все равно должна обращаться к "Method Area". А чтобы положить туда этот метод придется создать или модифицировать какой то класс.

Answer 3

В Java это невозможно. Но это есть в JavaScript и это называется прототипным программированием.

READ ALSO
Не работает Exception

Не работает Exception

Почему когда c условием в методе clickEquals при делении на ноль выходит из приложения(В приложении 'Calculyator' произошла ошибка),а без нее выводит...

211
Как сравнивать строки в Java?

Как сравнивать строки в Java?

В своей программе я использовал оператор == для сравнения строкНо я наткнулся на баг, и при замене == на equals он пропал

189
Объясните где ошибка!

Объясните где ошибка!

Помогите пожалуйста, вылезает ошибка:

156
Почему пишет «приложение AppName остановлено»?

Почему пишет «приложение AppName остановлено»?

Захотелось сделать приложение, которое будет в 15:45 включать звук на телефоне, а в 8:45 отключать звукЗахотелось реализовать через AsyncTask

135