 <p>I ended up using a <code>BindingTargetVisitor</code> which covers the use cases that I need.</p> <p>Note that this solution works for our specific use case but might be too limited for your use case, depending on the type of bindings and injections that you use.</p> <pre><code>public class InjectionPointExtractor extends DefaultBindingTargetVisitor&lt;Object, InjectionPoint&gt; { private final Predicate&lt;TypeLiteral&lt;?&gt;&gt; filter; public InjectionPointExtractor(Predicate&lt;TypeLiteral&lt;?&gt;&gt; filter) { this.filter = filter; } @Override public InjectionPoint visit(UntargettedBinding&lt;?&gt; untargettedBinding) { return getInjectionPointForKey(untargettedBinding.getKey()); } @Override public InjectionPoint visit(LinkedKeyBinding&lt;?&gt; linkedKeyBinding) { return getInjectionPointForKey(linkedKeyBinding.getLinkedKey()); } @Override public InjectionPoint visit(ProviderKeyBinding&lt;?&gt; providerKeyBinding) { return getInjectionPointForKey(providerKeyBinding.getProviderKey()); } private InjectionPoint getInjectionPointForKey(Key&lt;?&gt; key) { if (filter.test(key.getTypeLiteral())) { return InjectionPoint.forConstructorOf(key.getTypeLiteral()); } return null; } } </code></pre> <p>We use the <code>filter</code> to filter only on classes defined in our packages. This gets the job done in a nice and clean fashion.</p> <p>If you don't use <code>@Inject</code> constructors but instead use Guice to set fields directly, you could use <a href="https://github.com/google/guice/wiki/CustomInjections" rel="nofollow noreferrer">TypeListener</a></p>