I have spotted what I believe to be a bug in the Guice source code, namely
ProviderMethodsModule.getProviderMethods:
public List<ProviderMethod<?>> getProviderMethods(Binder binder) {
List<ProviderMethod<?>> result = Lists.newArrayList();
for (Class<?> c = delegate.getClass(); c != Object.class; c =
c.getSuperclass()) {
for (Method method : c.getDeclaredMethods()) {
if (method.isAnnotationPresent(Provides.class)) {
result.add(createProviderMethod(binder, method));
}
}
}
return result;
}
The bug is that using c.getDeclaredMethods() is a simplification, because
it would miss the following case:
public class FooSuper {
@PostConstruct
public void start() {
// Whatever
}
}
public class FooSub {
public void start() {
super.start();
}
}
Fact is, that FooSub.getDeclaredMethods() returns FooSub.start (a method
without annotation), and not FooSuper.start (the annotated method).
I can provide
a) a test case, that demonstrates the asserted behaviour of
Class.getDeclaredMethods()
b) a replacement method, that avoids that problem by iterating over super
classes and implemented interfaces.
However, I can't provide a test case that exposes the problem by using
Guice, because it is not clear to me, how to reach
ProviderMethodsModule.getProviderMethods().
For the same reason, I cannot judge, whether the problem is negligible, or
not. However, I suspect that Class.getDeclaredMethods() might be used
elsewhere.
Any interest?
Jochen
--
You received this message because you are subscribed to the Google Groups
"google-guice" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/google-guice.
For more options, visit https://groups.google.com/d/optout.