簡短的回答是:no,創建對象並調用方法的代碼是純Java(即非Groovy)代碼是不可能的。 Groovy通過攔截對象上的所有方法調用(Java對象和Groovy對象)並使用它的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));
}
}
和
// 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代碼使用它的方式。
你將如何在Java中解決它?使用反射? – Will 2013-04-08 18:01:23
我不知道,我希望能在Groovy中解決它。 – Alex 2013-04-08 19:29:06