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.

Reply via email to