Is there, in Java, a way to add some fields and methods to an existing class? What I want is that I have a class imported to my code, and I need to add some fields, derived from the existing fields, and their returning methods. Is there any way to do this?
-
2Can you subclass the existing class?Paul Tomblin– Paul Tomblin2012-12-05 19:30:32 +00:00Commented Dec 5, 2012 at 19:30
-
you can extend the class that you have and in the new class add new method...melli-182– melli-1822012-12-05 19:30:41 +00:00Commented Dec 5, 2012 at 19:30
-
1Do you control the source? Think about extending or composition.jlordo– jlordo2012-12-05 19:30:43 +00:00Commented Dec 5, 2012 at 19:30
-
26I am not sure why people down-voted this... I think what the guy wanted is an equivalent to extension methods from C#, where you don't have to subclass class A, but you can write an extension method foo() that then you can call on anything that is A or inherits from A... (A.foo()). Now I don't know if there is such thing, but it is tremendously useful.Daniel Gruszczyk– Daniel Gruszczyk2014-11-21 11:08:43 +00:00Commented Nov 21, 2014 at 11:08
-
2I am also looking for the functionality Daniel described above. I can't subclass the existing class (Selenium's Window class) because a lot of framework code instantiates it and I can't update them to instantiate my subclass instead. So I need to inject few methods into this class. The alternative is to create a new class hierarchy, but injecting methods directly into Window class would be cleaner. Does Java have something similar to C# extension methods?atlantis– atlantis2015-04-17 17:15:25 +00:00Commented Apr 17, 2015 at 17:15
4 Answers
You can create a class that extends the one you wish to add functionality to:
public class sub extends Original{
...
}
To access any of the private variables in the superclass, if there aren't getter methods, you can change them from "private" to "protected" and be able to reference them normally.
Hope that helps!
1 Comment
You can extend classes in Java. For Example:
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;
}
}
Now instances of B can access the public fields in A:
B b = new B("Test");
String name = b.getName();
String title = b.getTitle();
For more detailed tutorial take a look at Inheritance (The Java Tutorials > Learning the Java Language > Interfaces and Inheritance).
Edit: If class A has a constructor like:
public A (String name, String name2){
this.name = name;
this.name2 = name2;
}
then in class B you have:
public B(String name, String name2, String title){
super(name, name2); //calls the constructor in the A
this.title= title;
}
2 Comments
Assuming this question is asking about the equivalent of C# extension methods or JavaScript prototypes then technically it is possible as this one thing that Groovy does a lot. Groovy compiles Java and can extend any Java class, even final ones. Groovy has metaClass to add properties and methods (prototypes) such as:
// 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
I could explain how to do the same way as Groovy does, but maybe that would be too much for the poster. If they like, I can research and explain.