我正在开发一个 Eclipse RCP 应用程序,最近开始在其中使用 Groovy。所以我99%的代码仍然是Java。
我读到可以使用 Groovy 重写方法并向 Java 类添加方法,并且我能够通过向 java.lang.String 添加方法来测试这一点。
但这仅当我在 Groovy 类中使用字符串时才有效。被重写的方法不被视为在 Java 类中被重写。
这是一些代码:
/*
* 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 对象)上的所有方法调用并使用其展开元类 http://groovy.codehaus.org/ExpandoMetaClass添加行为。但是,它无法改变纯 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));
}
}
and
// ModifyStringClass.groovy (a Groovy class)
class ModifyStringClass {
public static messWithMetaClasses(String t) {
java.lang.String.metaClass.substring = { int n -> "!" }
println(t.substring(1))
}
}
你会得到输出:
Hello world
ello world
!
ello world
正如您所看到的,如果从其他 Groovy 代码调用纯 Java 对象的方法,Groovy 可以重写该方法,但它无法更改 Java 代码使用该方法的方式。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)