Open GoogleCodeExporter opened 9 years ago
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
Original comment by anthony....@gmail.com
on 29 Sep 2008 at 9:38
Hey Anthony . . . first off, apologies for the extremely slow turnaround.
I tried to create a JUnit testcase that reproduces this and I couldn't. Could
you send a patch that adds a test to MethodInterceptionTest that demonstrates
the problem? Once I can reproduce it, I can probably fix it.
Original comment by limpbizkit
on 30 Dec 2008 at 11:53
Below is a smaller JUnit-style testcase that reproduces the problem:
public void testDoesNotInterceptTwiceOnSyntheticMethods() {
Injector injector = Guice.createInjector(new AbstractModule() {
@Override
protected void configure() {
bind(Store.class).to(ConeyIslandStore.class);
bindInterceptor(Matchers.any(), new AbstractMatcher<Method>() {
public boolean matches(Method t) {
System.out.println("synthetic: " + t.isSynthetic() + ", t: " + t);
return true;
}
}, new CountingInterceptor());
}
});
Store store = injector.getInstance(Store.class);
store.cookDog();
assertEquals(1, count.get());
}
interface HotDog {}
static class NathansDog implements HotDog {}
interface Store {
HotDog cookDog();
}
static class ConeyIslandStore implements Store {
public NathansDog cookDog() {
return null;
}
}
(where CountingInterceptor is an interceptor that increments a 'count'
variable).
To be honest, I'm not certain we should fix this. Yes, it can intercept twice
if your matcher is broad... but if we rule out all synthetic methods, then it
may prevent your matcher from matching entirely, because it may only have
wanted to match on the return value from the synthetic method. Will think on
this a bit more...
Original comment by sberlin
on 19 Feb 2011 at 9:19
Issue 640 has been merged into this issue.
Original comment by sberlin
on 5 Jul 2011 at 2:13
Original issue reported on code.google.com by
anthony....@gmail.com
on 29 Sep 2008 at 9:37