2017-10-14 5 views
1

Une classe nommée InterceptorTest mise en œuvre GroovyInterceptable, qui pourrait être un intercepteur, a son invokeMethod overrided comme suit:Groovy: obtenu StackOverflowError par invokeMethod au sein Interceptor

class InterceptorTest implements GroovyInterceptable{ 
    def invokeMethod(String name,args){ 
     println "intercepting call! " //println a short message 
    } 
} 

Je pensais que la classe InterceptorTest être un intercepteur déléguerait toutes les méthodes appelle à invokeMethod, de sorte que les éléments suivants devraient fonctionner:

def interceptor=new InterceptorTest() 
println interceptor.work() 

Malheureusement, je suis un StackOverflowError, apparemment au corps de invokeMethod, mais je n'avais aucune idée pourquoi cela est arrivé.

En contrepartie, je modifié le corps de la fonction, non println mais juste return message:

class InterceptorTest implements GroovyInterceptable{ 
    def invokeMethod(String name,args){ 
     "intercepting call! " //return a short message 
    } 
} 

puis il a bien fonctionné:

def interceptor=new InterceptorTest() 
println interceptor.work() //get "intercepting call!" 

Mais POURQUOI?

Répondre

1

Selon "the documentation", "println" est en fait une méthode de la classe, injectée par Groovy. Par conséquent, vous obtenez une récursion infinie en essayant de l'appeler dans la fonction invokeMethod.

Nous ne pouvons pas utiliser des méthodes groovy par défaut comme println parce que ces méthodes sont injectées dans tous les objets Groovy ils seront interceptés aussi.