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

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

Ответы

Ответ 1

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

public class sub extends Original{
 ...
}

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

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

Ответ 2

Вы можете расширять классы на 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;
}

Ответ 3

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

Ответ 4

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

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