Package com.google.inject.spi
Class InjectionPoint
java.lang.Object
com.google.inject.spi.InjectionPoint
A constructor, field or method that can receive injections. Typically this is a member with the
@
Inject
annotation. For non-private, no argument constructors, the member may
omit the annotation.- Since:
- 2.0
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescription(package private) static class
(package private) static class
Node in the doubly-linked list of injectable members (fields and methods).(package private) static class
Linked list of injectable members.(package private) static class
(package private) static class
Keeps track of injectable methods so we can remove methods that get overridden in O(1) time.(package private) static enum
Position in type hierarchy.(package private) static class
A method signature. -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate final TypeLiteral<?>
private final com.google.common.collect.ImmutableList<Dependency<?>>
private static final Logger
private final Member
private final boolean
-
Constructor Summary
ConstructorsConstructorDescriptionInjectionPoint
(TypeLiteral<?> declaringType, Constructor<?> constructor) InjectionPoint
(TypeLiteral<?> declaringType, Field field, boolean optional) InjectionPoint
(TypeLiteral<?> declaringType, Method method, boolean optional) -
Method Summary
Modifier and TypeMethodDescriptionprivate static boolean
checkForMisplacedBindingAnnotations
(Member member, Errors errors) Returns true if the binding annotation is in the wrong place.boolean
static <T> InjectionPoint
forConstructor
(Constructor<T> constructor) Returns a new injection point for the specified constructor.static <T> InjectionPoint
forConstructor
(Constructor<T> constructor, TypeLiteral<? extends T> type) Returns a new injection point for the specified constructor oftype
.static InjectionPoint
forConstructorOf
(TypeLiteral<?> type) Returns a new injection point for the injectable constructor oftype
.static InjectionPoint
forConstructorOf
(Class<?> type) Returns a new injection point for the injectable constructor oftype
.static Set<InjectionPoint>
forInstanceMethodsAndFields
(TypeLiteral<?> type) Returns all instance method and field injection points ontype
.static Set<InjectionPoint>
forInstanceMethodsAndFields
(Class<?> type) Returns all instance method and field injection points ontype
.private com.google.common.collect.ImmutableList<Dependency<?>>
forMember
(Member member, TypeLiteral<?> type, Annotation[][] paramterAnnotations) static <T> InjectionPoint
forMethod
(Method method, TypeLiteral<T> type) Returns a new injection point for the specified method oftype
.static Set<InjectionPoint>
forStaticMethodsAndFields
(TypeLiteral<?> type) Returns all static method and field injection points ontype
.static Set<InjectionPoint>
forStaticMethodsAndFields
(Class<?> type) Returns all static method and field injection points ontype
.(package private) static Annotation
getAtInject
(AnnotatedElement member) private static Field[]
getDeclaredFields
(TypeLiteral<?> type) private static Method[]
getDeclaredMethods
(TypeLiteral<?> type) TypeLiteral<?>
Returns the generic type that defines this injection point.List<Dependency<?>>
Returns the dependencies for this injection point.private static Set<InjectionPoint>
getInjectionPoints
(TypeLiteral<?> type, boolean statics, Errors errors) Returns an ordered, immutable set of injection points for the given type.Returns the injected constructor, field, or method.int
hashCode()
private static List<TypeLiteral<?>>
hierarchyFor
(TypeLiteral<?> type) private static boolean
isEligibleForInjection
(Method method, boolean statics) Returns true if the method is eligible to be injected.boolean
Returns true if this injection point shall be skipped if the injector cannot resolve bindings for all required dependencies.boolean
Returns true if the element is annotated with @Toolable
.private static boolean
isValidMethod
(InjectionPoint.InjectableMethod injectableMethod, Errors errors) private <T> Dependency<T>
newDependency
(Key<T> key, boolean allowsNull, int parameterIndex) private static boolean
Returns true if a overrides b.toString()
-
Field Details
-
logger
-
optional
private final boolean optional -
member
-
declaringType
-
dependencies
-
-
Constructor Details
-
InjectionPoint
InjectionPoint(TypeLiteral<?> declaringType, Method method, boolean optional) -
InjectionPoint
InjectionPoint(TypeLiteral<?> declaringType, Constructor<?> constructor) -
InjectionPoint
InjectionPoint(TypeLiteral<?> declaringType, Field field, boolean optional)
-
-
Method Details
-
forMember
private com.google.common.collect.ImmutableList<Dependency<?>> forMember(Member member, TypeLiteral<?> type, Annotation[][] paramterAnnotations) -
newDependency
-
getMember
Returns the injected constructor, field, or method. -
getDependencies
Returns the dependencies for this injection point. If the injection point is for a method or constructor, the dependencies will correspond to that member's parameters. Field injection points always have a single dependency for the field itself.- Returns:
- a possibly-empty list
-
isOptional
public boolean isOptional()Returns true if this injection point shall be skipped if the injector cannot resolve bindings for all required dependencies. Both explicit bindings (as specified in a module), and implicit bindings (@ImplementedBy
, default constructors etc.) may be used to satisfy optional injection points. -
isToolable
public boolean isToolable()Returns true if the element is annotated with @Toolable
.- Since:
- 3.0
-
getDeclaringType
Returns the generic type that defines this injection point. If the member exists on a parameterized type, the result will include more type information than the member'sraw declaring class
.- Since:
- 3.0
-
equals
-
hashCode
public int hashCode() -
toString
-
forConstructor
Returns a new injection point for the specified constructor. If the declaring type ofconstructor
is parameterized (such asList<T>
), prefer the overload that includes a type literal.- Parameters:
constructor
- any single constructor present ontype
.- Since:
- 3.0
-
forConstructor
public static <T> InjectionPoint forConstructor(Constructor<T> constructor, TypeLiteral<? extends T> type) Returns a new injection point for the specified constructor oftype
.- Parameters:
constructor
- any single constructor present ontype
.type
- the concrete type that definesconstructor
.- Since:
- 3.0
-
forConstructorOf
Returns a new injection point for the injectable constructor oftype
.- Parameters:
type
- a concrete type with exactly one constructor annotated @Inject
, or a no-arguments constructor that is not private.- Throws:
ConfigurationException
- if there is no injectable constructor, more than one injectable constructor, or if parameters of the injectable constructor are malformed, such as a parameter with multiple binding annotations.
-
forConstructorOf
Returns a new injection point for the injectable constructor oftype
.- Parameters:
type
- a concrete type with exactly one constructor annotated @Inject
, or a no-arguments constructor that is not private.- Throws:
ConfigurationException
- if there is no injectable constructor, more than one injectable constructor, or if parameters of the injectable constructor are malformed, such as a parameter with multiple binding annotations.
-
forMethod
Returns a new injection point for the specified method oftype
. This is useful for extensions that need to build dependency graphs from arbitrary methods.- Parameters:
method
- any single method present ontype
.type
- the concrete type that definesmethod
.- Since:
- 4.0
-
forStaticMethodsAndFields
Returns all static method and field injection points ontype
.- Returns:
- a possibly empty set of injection points. The set has a specified iteration order. All fields are returned and then all methods. Within the fields, supertype fields are returned before subtype fields. Similarly, supertype methods are returned before subtype methods.
- Throws:
ConfigurationException
- if there is a malformed injection point ontype
, such as a field with multiple binding annotations. The exception'spartial value
is aSet<InjectionPoint>
of the valid injection points.
-
forStaticMethodsAndFields
Returns all static method and field injection points ontype
.- Returns:
- a possibly empty set of injection points. The set has a specified iteration order. All fields are returned and then all methods. Within the fields, supertype fields are returned before subtype fields. Similarly, supertype methods are returned before subtype methods.
- Throws:
ConfigurationException
- if there is a malformed injection point ontype
, such as a field with multiple binding annotations. The exception'spartial value
is aSet<InjectionPoint>
of the valid injection points.
-
forInstanceMethodsAndFields
Returns all instance method and field injection points ontype
.- Returns:
- a possibly empty set of injection points. The set has a specified iteration order. All fields are returned and then all methods. Within the fields, supertype fields are returned before subtype fields. Similarly, supertype methods are returned before subtype methods.
- Throws:
ConfigurationException
- if there is a malformed injection point ontype
, such as a field with multiple binding annotations. The exception'spartial value
is aSet<InjectionPoint>
of the valid injection points.
-
forInstanceMethodsAndFields
Returns all instance method and field injection points ontype
.- Returns:
- a possibly empty set of injection points. The set has a specified iteration order. All fields are returned and then all methods. Within the fields, supertype fields are returned before subtype fields. Similarly, supertype methods are returned before subtype methods.
- Throws:
ConfigurationException
- if there is a malformed injection point ontype
, such as a field with multiple binding annotations. The exception'spartial value
is aSet<InjectionPoint>
of the valid injection points.
-
checkForMisplacedBindingAnnotations
Returns true if the binding annotation is in the wrong place. -
getAtInject
-
getInjectionPoints
private static Set<InjectionPoint> getInjectionPoints(TypeLiteral<?> type, boolean statics, Errors errors) Returns an ordered, immutable set of injection points for the given type. Members in superclasses come before members in subclasses. Within a class, fields come before methods. Overridden methods are filtered out. The order of fields/methods within a class is consistent but undefined.- Parameters:
statics
- true is this method should return static members, false for instance memberserrors
- used to record errors
-
getDeclaredFields
-
getDeclaredMethods
-
isEligibleForInjection
Returns true if the method is eligible to be injected. This is different thanisValidMethod(com.google.inject.spi.InjectionPoint.InjectableMethod, com.google.inject.internal.Errors)
, because ineligibility will not drop a method from being injected if a superclass was eligible & valid. Bridge & synthetic methods are excluded from eligibility for two reasons:Prior to Java8, javac would generate these methods in subclasses without annotations, which means this would accidentally stop injecting a method annotated with
Inject
, since the spec says to stop injecting if a subclass isn't annotated with it.Starting at Java8, javac copies the annotations to the generated subclass method, except it leaves out the generic types. If this considered it a valid injectable method, this would eject the parent's overridden method that had the proper generic types, and would use invalid injectable parameters as a result.
The fix for both is simply to ignore these synthetic bridge methods.
-
isValidMethod
private static boolean isValidMethod(InjectionPoint.InjectableMethod injectableMethod, Errors errors) -
hierarchyFor
-
overrides
Returns true if a overrides b. Assumes signatures of a and b are the same and a's declaring class is a subclass of b's declaring class.
-