Вопрос по java, methods, field, add – Java: Добавление полей и методов в существующий класс?

26

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

Можете ли вы создать подкласс существующего класса? Paul Tomblin
Я также ищу функциональность Дэниела, описанную выше. Я могу'подкласс существующего класса (Selenium 's Класс окна), потому что много кода структуры создает его, и я могу 'вместо этого обновите их, чтобы создать экземпляр моего подкласса. Поэтому мне нужно добавить несколько методов в этот класс. Альтернативой является создание новой иерархии классов, но внедрение методов непосредственно в класс Window будет более понятным. Есть ли в Java что-то похожее на методы расширения C #? atlantis
Вы можете расширить класс, который у вас есть, и в новом классе добавить новый метод ... melli-182
Вы контролируете источник? Подумайте о расширении или композиции. jlordo
Я не уверен, почему люди проголосовали против этого ... Я думаю, что парень хотел эквивалентно методам расширения из C #, где вы ненет необходимости создавать подкласс класса A, но вы можете написать метод расширения foo (), который затем можно вызывать для всего, что является A или наследуется от A ... (A.foo ()). Теперь я неЯ не знаю, есть ли такая вещь, но она чрезвычайно полезна. Daniel Gruszczyk

Ваш Ответ

4   ответа
3

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

public class sub extends Original{
 ...
}

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

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

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

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

3

Вы можете расширить классы в 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 Schoen
Спасибо, довольно полезно! Теперь, сколько супер (поле) я могу использовать, потому что, если конструктор из ex. верхняя парадигма имеет два поля, второе становится неправильным. user1880174
-3

что этот вопрос задает вопрос об эквивалентных методах расширения 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, но, возможно, это было бы слишком много для автора. Если им нравится, я могу исследовать и объяснить.

Пост не сделалне прошу объяснения особенностей Groovy. PLG
Правильно - я пытался быть полезным, добавляя больше информации. Очевидно, что расширение / подклассификация является обычным способом, и многие люди указали на это, но если по какой-то причине мы воспринимаем вопросника буквально - он хотел добавить поля / методы в существующий класс в Java, то это не для свет сердечный Groovy - это, по сути, улучшенная Java с утиным типом. Одной из функций, которые они добавили, была именно эта способность. Groovy довольно крутой, и как программист на Java я бы порекомендовал изучить его. Paul Bartlett
Да, я понимаю, и я мог бы даже согласиться с вами по поводу Groovy, но когда кто-то приходит сюда за помощью в Java, реклама Groovy не является правильным ответом. PLG
Этот ответ не имеет ничего общего с java.lang.reflections. Я неЯ даже не понимаю, что это. Surajit Biswas

Похожие вопросы