2013-04-08 56 views
4

我正在開發Eclipse RCP應用程序,最近我開始在其中使用Groovy。所以99%的代碼仍然是Java。當我的代碼中未實例化Java類時,是否可以使用Groovy覆蓋Java類中的方法?

我讀過可以使用Groovy覆蓋和向Java類添加方法,並且我可以通過向java.lang.String添加方法來測試此方法。

但是,這隻適用於我在Groovy類中使用字符串。重寫的方法不被視爲在Java類中被重寫。

下面是一些代碼:

​​

我需要從控制選項卡。但由於實例化MyViewPart並不是我,而是一些私有API,所以我無法訪問它。 Groovy能爲我做些什麼嗎?任何建議或代碼是受歡迎的。謝謝!

+0

你將如何在Java中解決它?使用反射? – Will 2013-04-08 18:01:23

+0

我不知道,我希望能在Groovy中解決它。 – Alex 2013-04-08 19:29:06

回答

10

簡短的回答是: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代碼使用它的方式。

相關問題