38

在 Java 中,是否有一种向现有类添加一些字段和方法的方法?我想要的是我有一个类导入到我的代码中,我需要添加一些从现有字段派生的字段及其返回方法。有没有办法做到这一点?

4

4 回答 4

7

您可以创建一个类来扩展您希望添加功能的类:

public class sub extends Original{
 ...
}

要访问超类中的任何私有变量,如果没有 getter 方法,您可以将它们从“私有”更改为“受保护”并能够正常引用它们。

希望有帮助!

于 2012-12-05T19:31:46.727 回答
4

您可以在 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;
}
于 2012-12-05T19:33:19.830 回答
2

这些示例仅在您扩展的类不是最终类时才真正适用。例如,您不能使用此方法扩展 java.lang.String。然而,还有其他方法,例如使用 CGLIB、ASM 或 AOP 使用字节码注入。

于 2013-11-13T19:37:37.663 回答
-4

假设这个问题是询问 C# 扩展方法或 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 相同的方式进行操作,但对于发帖者来说,这可能太过分了。如果他们愿意,我可以研究和解释。

于 2016-05-14T22:10:49.010 回答