2010-10-27 19 views
1

我想在我的Groovy代碼中重寫java類型實例的方法的功能,但我得到一個classcast異常。如何用Groovy元編程重寫java類型實例的方法?

我看着指南貼here,但我不能得到它的工作。

由於我的實際問題有點混亂,下面是一些可運行的示例代碼,失敗時會出現相同的錯誤。 在這個例子中,我想覆蓋java.lang.String類的實例的substring方法。實際上,我想重寫一個沒有相應Groovy實現的類的實例的方法,因此我的示例的答案不是簡單地使用Groovy字符串實例。

class example { 
    static void main(args) { 
     java.lang.String hey = new java.lang.String("hey") 
     ExpandoMetaClass emc = new ExpandoMetaClass(java.lang.String, false) 
      emc.substring = { 
         "This is not a very good substring implementation" 
       } 
      emc.initialize() 

     def proxiedHey = new groovy.util.Proxy().wrap(hey) 
     proxiedHey.setMetaClass(emc) 
     printf proxiedHey.toString() 
     printf proxiedHey.substring(1) 
    } 
} 

上述示例在第12行失敗,即printf meh.toString()。拋出的異常是

夾縫:java.lang.ClassCastException: groovy.util.Proxy不能在 example.main(test.groovy:12)被轉換爲 java.lang.CharSequence中

那麼,我做什麼錯誤的任何想法,或者如果有另一種方法來解決我的java類型實例的方法添加和/或重寫的問題?

我正在使用Groovy版本1.7.4。

回答

2

您正在爲java.lang.String創建ExpandoMetaClass,但將其分配給groovy.util.Proxy。讓元類爲groovy.util.Proxy instread,就像這樣:

java.lang.String hey = new java.lang.String("hey") 
def proxiedHey = new groovy.util.Proxy().wrap(hey) 
ExpandoMetaClass emc = new ExpandoMetaClass(groovy.util.Proxy, false) 
emc.substring = { 
    "This is not a very good substring implementation" 
} 
emc.initialize() 

proxiedHey.setMetaClass(emc) 
printf proxiedHey.toString() 
printf proxiedHey.substring(1) 
+0

感謝您的及時正確的回覆! – John 2010-11-04 13:11:36

0

你看着Pimp my Library Pattern它允許你使用Groovy Categories補充。您可能會發現在您的案例中更方便,更易於理解。

@Category(String) 
class StringSubstrCategory {  
    def substring(int n) { 
     "This is not a very good substring implementation" 
    } 
} 

use (StringSubstrCategory) { 
    "hey".substring(1) 
} 
相關問題