当Java类没有在我的代码中实例化时,是否可以使用Groovy重写Java类中的方法?
我正在开发一个EclipseRCP应用程序,最近我开始在其中使用Groovy。所以我99%的代码仍然是Java 我读到可以使用Groovy重写Java类并向Java类添加方法,并且我能够通过向Java.lang.String添加一个方法来测试这一点 但这仅在Groovy类中使用字符串时有效。重写的方法不被视为在Java类中被重写 下面是一些代码:当Java类没有在我的代码中实例化时,是否可以使用Groovy重写Java类中的方法?,java,eclipse,groovy,eclipse-rcp,rcp,Java,Eclipse,Groovy,Eclipse Rcp,Rcp,我正在开发一个EclipseRCP应用程序,最近我开始在其中使用Groovy。所以我99%的代码仍然是Java 我读到可以使用Groovy重写Java类并向Java类添加方法,并且我能够通过向Java.lang.String添加一个方法来测试这一点 但这仅在Groovy类中使用字符串时有效。重写的方法不被视为在Java类中被重写 下面是一些代码: /* * This is a Java class */ public class CTabItem { ... private AP
/*
* This is a Java class
*/
public class CTabItem {
...
private API
...
public void setControl(Control control){
private API
}
}
/*
* This is also a Java class
*/
public class Control {
...
private API
...
}
/*
* This is also a Java class
*/
public class OtherClass {
...
private API
...
private void someMethodIDontKnow(){
Control control = new Control();
CTabItem tab = new CTabItem();
tab.setControl(control);
}
}
/*
* This is a Groovy class
*/
public class MyViewPart extends org.eclipse.ui.part.ViewPart {
....
public void createPartControl(Composite parent) {
/* parent (or the parent of parent) is a Control
which is set somewhere in a CTabItem to which
I don't get access */
}
}
我需要从控件中获取选项卡。但由于实例化MyViewPart的不是我,而是一些私有API,所以我无法访问它。
Groovy能为我做些什么吗?欢迎任何建议或代码。谢谢大家! 简单的回答是:不,如果创建对象并调用方法的代码是纯Java(即非Groovy)代码,则不可能。Groovy通过截取对象(Java对象和Groovy对象)上的所有方法调用并使用其添加行为来发挥其魔力。然而,它不能改变纯Java代码如何决定在纯Java类上调用哪个方法。要查看,请运行以下示例代码:
// UseTheString.java (a pure Java class)
public class UseTheString {
public static void main(String[] arg) {
String s = "Hello world";
System.out.println(s);
System.out.println(s.substring(1));
ModifyStringClass.messWithMetaClasses(s);
System.out.println(s.substring(1));
}
}
及
您将获得以下输出:
Hello world
ello world
!
ello world
如您所见,如果从其他Groovy代码调用纯Java对象,Groovy可以重写该方法,但它不能更改Java代码使用它的方式。您将如何在Java中解决它?使用反射?我不知道,我希望用Groovy解决它。
Hello world
ello world
!
ello world