Java: Добавление полей и методов в существующий класс?

Есть ли в Java способ добавить некоторые поля и методы в существующий класс? Я хочу, чтобы у меня был класс, импортированный в мой код, и мне нужно добавить некоторые поля, полученные из существующих полей, и методы их возврата. Есть какой-либо способ сделать это?

 Paul Tomblin05 дек. 2012 г., 20:30
Можете ли вы создать подкласс существующего класса?
 melli-18205 дек. 2012 г., 20:30
Вы можете расширить класс, который у вас есть, и в новом классе добавить новый метод ...
 atlantis17 апр. 2015 г., 19:15
Я также ищу функциональность Дэниела, описанную выше. Я могу'подкласс существующего класса (Selenium 's Класс окна), потому что много кода структуры создает его, и я могу 'вместо этого обновите их, чтобы создать экземпляр моего подкласса. Поэтому мне нужно добавить несколько методов в этот класс. Альтернативой является создание новой иерархии классов, но внедрение методов непосредственно в класс Window будет более понятным. Есть ли в Java что-то похожее на методы расширения C #?
 jlordo05 дек. 2012 г., 20:30
Вы контролируете источник? Подумайте о расширении или композиции.
 Daniel Gruszczyk21 нояб. 2014 г., 12:08
Я не уверен, почему люди проголосовали против этого ... Я думаю, что парень хотел эквивалентно методам расширения из C #, где вы ненет необходимости создавать подкласс класса A, но вы можете написать метод расширения foo (), который затем можно вызывать для всего, что является A или наследуется от A ... (A.foo ()). Теперь я неЯ не знаю, есть ли такая вещь, но она чрезвычайно полезна.

Ответы на вопрос(4)

еслирасширяется нет финал. Например, вы не можете расширить java.lang.String, используя этот метод. Однако существуют и другие способы, такие как использование внедрения байтового кода с использованием CGLIB, ASM или AOP.

который расширяет тот, к которому вы хотите добавить функциональность:

public class sub extends Original{
 ...
}

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

Надеюсь, это поможет!

 DavidJ17 янв. 2019 г., 22:05
ОП спросил о добавлении всуществующий класс, поэтому предложение создания нового класса явно неТ удовлетворить запрос.

Вы можете расширить классы в Java. Например:

public class A {

  private String name;

  public A(String name){
    this.name = name;
  }

  public String getName(){
    return this.name;
  }

  public void setName(String name) {
    this.name = name;
  }

}

public class B extends A {
  private String title;

  public B(String name, String title){
    super(name); //calls the constructor in the parent class to initialize the name
    this.title= title;
  }      

  public String getTitle(){
    return this.title;
  }

  public void setTitle(String title) {
    this.title= title;
  }
}

Теперь случаиB Доступ к публичным полям в:A

B b = new B("Test");
String name = b.getName();
String title = b.getTitle();

Для более подробного урока взгляните наНаследование (Учебные руководства Java> Изучение языка Java> Интерфейсы и наследование).

Редактировать: Если классA имеет конструктор как:

public A (String name, String name2){
  this.name = name;
  this.name2 = name2;
}

тогда в классеB у тебя есть:

public B(String name, String name2, String title){
  super(name, name2); //calls the constructor in the A 
  this.title= title;
}
 Jacob Schoen05 дек. 2012 г., 22:19
Ах, вы просто делаете один звонок в супер. В основном это вызывает конструктор родительского класса. Таким образом, вы вызываете его только один раз в конструкторе, и это должна быть первая строка. Смотрите редактировать.
 user188017405 дек. 2012 г., 22:11
Спасибо, довольно полезно! Теперь, сколько супер (поле) я могу использовать, потому что, если конструктор из ex. верхняя парадигма имеет два поля, второе становится неправильным.

что этот вопрос задает вопрос об эквивалентных методах расширения C # или прототипах JavaScript, то технически это возможно, поскольку Groovy многое делает. Groovy компилирует Java и может расширять любой класс Java, даже финальный. Groovy имеет метакласс для добавления свойств и методов (прототипов), таких как:

// Define new extension method
String.metaClass.goForIt = { return "hello ${delegate}" }

// Call it on a String
"Paul".goForIt() // returns "hello Paul"

// Create new property
String.metaClass.num = 123

// Use it - clever even on constants
"Paul".num // returns 123
"Paul".num = 999 // sets to 999
"fred".num // returns 123

Я мог бы объяснить, как сделать то же самое, что и Groovy, но, возможно, это было бы слишком много для автора. Если им нравится, я могу исследовать и объяснить.

 PLG21 нояб. 2017 г., 09:53
Пост не сделалне прошу объяснения особенностей Groovy.
 Surajit Biswas02 апр. 2019 г., 14:16
Этот ответ не имеет ничего общего с java.lang.reflections. Я неЯ даже не понимаю, что это.
 PLG29 нояб. 2017 г., 20:05
Да, я понимаю, и я мог бы даже согласиться с вами по поводу Groovy, но когда кто-то приходит сюда за помощью в Java, реклама Groovy не является правильным ответом.
 Paul Bartlett29 нояб. 2017 г., 19:56
Правильно - я пытался быть полезным, добавляя больше информации. Очевидно, что расширение / подклассификация является обычным способом, и многие люди указали на это, но если по какой-то причине мы воспринимаем вопросника буквально - он хотел добавить поля / методы в существующий класс в Java, то это не для свет сердечный Groovy - это, по сути, улучшенная Java с утиным типом. Одной из функций, которые они добавили, была именно эта способность. Groovy довольно крутой, и как программист на Java я бы порекомендовал изучить его.

Ваш ответ на вопрос