James Zeng
James Zeng

Reputation: 53

Groovy: Got StackOverflowError when override invokeMethod with a closure

I'm trying to enhance my Grails project with Groovy AOP approach. However I always got StackOverflowError if I override invokeMethod with a closure. Here is my test code, I can reproduce the error with groovy 2.1.3, thanks!

class A implements GroovyInterceptable
{
    void foo(){
        System.out.println( "A.foo");
    }
}

class B extends A
{
    void foo(){
        System.out.println( "B.foo");
        super.foo();
    }
}

def mc = B.metaClass;

mc.invokeMethod = { String name, args ->

    // do "before" and/or "around" work here

    try {
        def value = mc.getMetaMethod(name, args).invoke(delegate, args)

        // do "after" work here

        return value // or another value
    }
    catch (e) {
        // do "after-throwing" work here
    }
}


B b = new B();
b.foo();

Upvotes: 0

Views: 404

Answers (1)

dmahapatro
dmahapatro

Reputation: 50245

Looks like, if you have a call to super() then metaClass uses the cache to find the method and throws a StackOverflow eventually. In that case if you metaClass A instead of B, it all works fine.

def mc = A.metaClass

I can infer it this way, class implementing GroovyInterceptable directly should override invokeMethod.

@Source MetaClassImpl

Upvotes: 2

Related Questions