Java:如何向现有类添加字段和方法?

41

在Java中,是否有一种方法可以向现有类添加字段和方法? 我的需求是我导入了一个类到我的代码中,我需要添加一些字段,这些字段由现有字段导出,并且需要它们的返回方法。 有没有办法做到这一点?


2
你能够继承现有的类吗? - Paul Tomblin
你可以扩展你已有的类,并在新类中添加新方法... - melli-182
1
你掌控源代码了吗?考虑扩展或组合。 - jlordo
25
我不确定为什么人们会对此进行负面评价……我认为这个人想要的是类似于C#中的扩展方法,你不需要子类化A类,而是可以编写一个扩展方法foo(),然后你可以在任何A或继承A的东西上调用它(A.foo())。现在我不知道是否有这样的功能,但它非常有用。 - Daniel Gruszczyk
2
我也在寻找Daniel上面描述的功能。我无法对现有类(Selenium的Window类)进行子类化,因为许多框架代码实例化它,而我无法更新它们以实例化我的子类。因此,我需要将几种方法注入到这个类中。另一种选择是创建一个新的类层次结构,但是直接将方法注入到Window类中会更清晰。Java是否有类似于C#扩展方法的东西? - atlantis
4个回答

7
您可以创建一个继承您希望添加功能的类的类:
```html

您可以创建一个继承您希望添加功能的类的类:

```
public class sub extends Original{
 ...
}

如果超类中没有getter方法,想要访问任何私有变量,可以将它们从“private”更改为“protected”,然后正常引用即可。

希望这能帮到你!


2
OP询问如何添加到一个已存在的类中,因此建议创建一个新类显然不能满足请求。 - DavidJ

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;
}

1
谢谢,非常有帮助!现在我可以使用多少个super(field),因为如果上层范例的构造函数有两个字段,第二个就会出错。 - Pots Spi
啊,你只需要调用一次super。基本上它是在调用父类的构造函数。所以你只需要在构造函数中调用一次,并且它必须是第一行。请参见编辑。 - Jacob Schoen

2

如果你要继承的类是final的,那么这些例子实际上并不适用。例如,你不能使用这种方法来扩展java.lang.String类。但是,还有其他方法,比如使用CGLIB、ASM或AOP进行字节码注入。


-5
假设这个问题是在询问C#扩展方法或JavaScript原型的等效物,那么从技术上讲,这是可能的,因为Groovy经常做这件事。Groovy编译Java并可以扩展任何Java类,甚至是final类。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一样做,但也许对于发帖者来说这太多了。如果他们愿意,我可以进行研究并解释。


3
该帖子并未要求解释Groovy的特性。 - PLG
1
正确 - 我试图通过添加更多信息来提供帮助。显然,扩展/子类化是通常的方法,很多人指出了这一点,但如果我们按照提问者的字面意思 --- 他想在Java中向现有类添加字段/方法,那么这并不是轻松的事情。Groovy基本上是一个改进的鸭子类型Java。他们添加的功能之一就是这种能力。Groovy非常棒,作为一个Java程序员,我建议你去了解一下。 - Paul Bartlett
2
是的,我明白你的意思,甚至可能同意你对Groovy的看法,但当有人来这里寻求Java帮助时,Groovy广告并不是正确的答案。 - PLG
1
这个答案与java.lang.reflections没有任何关系。我甚至不理解这是什么。 - Surajit Biswas
其实我的答案与Java有很大关系 :-) Groovy可以扩展Java类,然后你可以在Java代码中使用它。Groovy是一种JVM语言。希望这解释了我的理由。 - Paul Bartlett

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接