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