I discover the origin of this problem:

interface ITotoService {
     IToto doSomething();
}

class TotoServiceImpl {
     Toto doSomething() {
        return ..... ;
     }
}

Observe the return type of both methods.

First, the interface, returns IToto.
Second, the implementation returns Toto.

In this case, the invoke() method of a Matcher<Method> class is called
twice!

I think Guice should not ask for invocation when a method is "synthetic"
("volatile", "bridge", ... any methods generated by compiler)...

What's your point of view?

Regards,
Anthony MÜLLER



2008/9/15 Anthony MULLER <[EMAIL PROTECTED]>

> Hello,
>
> Thanks for this explanation, it will be helpful in future!
>
> My mistake was quite different I think.. I wrote my own method matcher and
> I don't know all the rules of reflection in Java. I just add a trick to
> "forget" method this "volatile" modifier.
>
> I'd like somebody from Guice Team looked at this and told me if it is ok or
> not?
>
> Cheers,
> Anthony
>
>     /**
>      * Search for the method signature into all the interface annotated
> with a
>      * given annotation.
>      */
>     public boolean matches(Method method) {
>         // Hook to avoid twice interceptions of the same method
>         if (Modifier.isVolatile(method.getModifiers())) {
>             return false;
>         }
>
>         boolean matches = false;
>         Class<?> type = method.getDeclaringClass();
>         Class<?>[] iTypes = ReflectUtils.getInterfaces(type, annClass);
>         for (Class<?> iType : iTypes) {
>             Method iMethod = null;
>
>             try {
>                 iMethod = iType.getDeclaredMethod(method.getName(), method
>                         .getParameterTypes());
>             } catch (SecurityException e) {
>                 // Should never happen
>             } catch (NoSuchMethodException e) {
>                 // Should never happen
>             }
>             if (iMethod != null) {
>                 matches = true;
>                 break;
>             }
>         }
>
>         return matches;
>     }
>
>
> 2008/9/13 tzwoenn <[EMAIL PROTECTED]>
>
>
>> I had the same problem, but it was caused by myself. Actually I had
>> bound the same interceptor during for class level und method level
>> interception, like
>>
>> bindInterceptor(any(), annotatedWith(Interceptors.class),
>> javaxInterceptor);
>> bindInterceptor(annotatedWith(Interceptors.class), any(),
>> javaxInterceptor);
>>
>> If both - @Interceptors at class and method level - are found, the
>> interceptor is called twice. This could be solved by
>>
>> bindInterceptor(any(), annotatedWith(Interceptors.class),
>> javaxInterceptor);
>> bindInterceptor(annotatedWith(Interceptors.class),
>> not(annotatedWith(Interceptors.class)), javaxInterceptor);
>>
>> Maybe you made a similar mistake while configuring the interceptor?
>>
>>
>> On Sep 12, 2:06 pm, "Anthony MULLER" <[EMAIL PROTECTED]> wrote:
>> > Hmmm... With debugger, when I looked to MethodInvocation instance given
>> to
>> > invoke() method, I saw something quite strange.
>> >
>> > in the "proxy" field of "mi" (MethodInvocation  instance), there are
>> many
>> > "CGLIB$CALLBACK_" fields... Ok...
>> >
>> > BUT : I found two similars CGLIB$CALLBACK_0 and CGLIB$CALLBACK_1
>> >
>> > The target methods are respectively :
>> >
>> > public volatile com.xxx.MyObject
>> > com.xxx.MyObjectServiceImpl.createXXX(com.xxx.Session)
>> > public com.xxx.MyObject
>> > com.xxx.MyObjectServiceImpl.createXXX(com.xxx.Session)
>> >
>> > So, the same method is present twice, with just "volatile" as
>> difference...
>> >
>> > Why???
>> >
>> > Another method into the same class doesn't have this behaviour
>> (interceptor
>> > calling interceptor again calling the real method...)
>> >
>> > Regards,
>> > Anthony MÜLLER
>> >
>> > 2008/9/12 Anthony MULLER <[EMAIL PROTECTED]>
>> >
>> > > Hello,
>> >
>> > > When I use AOP feature, sometimes I have a strange behaviour and I
>> don't
>> > > know why...
>> >
>> > > When I call mi.proceed(); into invoke() method of the interceptor, the
>> > > interceptor's invoke() method is called again! But the intercepted
>> method is
>> > > called once has expected...
>> >
>> > > Why the interceptor is called twice sometimes?
>> >
>> > > Regards,
>> > > Anthony MÜLLER
>> >
>> >
>> >>
>>
>

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"google-guice" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/google-guice?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to