2010-10-27 4 views
1

J'essaye de remplacer la fonctionnalité d'une méthode d'une instance de type java dans mon code Groovy mais j'obtiens une exception de classcast.Comment remplacer une méthode pour une instance de type java avec Groovy meta programming?

J'ai regardé le guide posté here mais je n'arrive pas à le faire fonctionner.

Puisque mon problème actuel est un peu de désordre, voici un exemple de code exécutable qui échoue avec la même erreur. Dans l'exemple, je souhaite remplacer la méthode de sous-chaîne d'une instance de la classe java.lang.String. En réalité, je veux remplacer une méthode d'une instance d'une classe qui n'a pas d'implémentation Groovy correspondante, donc la réponse à mon exemple n'est pas simplement d'utiliser une instance de chaîne Groovy. L'exemple ci-dessus échoue à la ligne 12, c'est-à-dire printf meh.toString(). L'exception est lancée

Pris: java.lang.ClassCastException: groovy.util.Proxy ne peut pas être jeté à java.lang.CharSequence à example.main (test.groovy: 12)

Donc, des idées sur ce que je fais mal ou s'il y a une autre façon de résoudre mon problème d'ajouter et/ou de surcharger des méthodes d'une instance de type java? J'utilise Groovy version 1.7.4.

Répondre

2

Vous créez un ExpandoMetaClass pour java.lang.String, mais en l'attribuant à un groovy.util.Proxy. Faire un métaclasse pour groovy.util.Proxy instread, comme ceci:

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

Merci de votre réponse rapide et correcte! – John

0

Avez-vous regardé Pimp my Library Pattern qui vous permet d'ajouter à l'aide Groovy Categories. Vous pourriez trouver cela plus pratique et facile à comprendre dans votre cas.

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

use (StringSubstrCategory) { 
    "hey".substring(1) 
} 
Questions connexes