Class Invokable<T,R>
- java.lang.Object
-
- com.google.common.reflect.Invokable<T,R>
-
- Type Parameters:
T
- the type that owns this method or constructor.R
- the return type of (or supertype thereof) the method or the declaring type of the constructor.
- All Implemented Interfaces:
java.lang.reflect.AnnotatedElement
,java.lang.reflect.Member
public abstract class Invokable<T,R> extends java.lang.Object implements java.lang.reflect.AnnotatedElement, java.lang.reflect.Member
Wrapper around either aMethod
or aConstructor
. Convenience API is provided to make common reflective operation easier to deal with, such asisPublic()
,getParameters()
etc.In addition to convenience methods,
TypeToken.method(java.lang.reflect.Method)
andTypeToken.constructor(java.lang.reflect.Constructor<?>)
will resolve the type parameters of the method or constructor in the context of the owner type, which may be a subtype of the declaring class. For example:Method getMethod = List.class.getMethod("get", int.class); Invokable<List<String>, ?> invokable = new TypeToken<List<String>>() {}.method(getMethod); assertEquals(TypeToken.of(String.class), invokable.getReturnType()); // Not Object.class! assertEquals(new TypeToken<List<String>>() {}, invokable.getOwnerType());
Note: earlier versions of this class inherited from
AccessibleObject
andGenericDeclaration
. Since version 31.0 that is no longer the case. However, most methods from those types are present with the same signature in this class.- Since:
- 14.0 (no longer implements
AccessibleObject
orGenericDeclaration
since 31.0) - Author:
- Ben Yu
-
-
Method Summary
All Methods Static Methods Instance Methods Abstract Methods Concrete Methods Deprecated Methods Modifier and Type Method Description boolean
equals(java.lang.Object obj)
static <T> Invokable<T,T>
from(java.lang.reflect.Constructor<T> constructor)
ReturnsInvokable
ofconstructor
.static Invokable<?,java.lang.Object>
from(java.lang.reflect.Method method)
ReturnsInvokable
ofmethod
.abstract java.lang.reflect.AnnotatedType
getAnnotatedReturnType()
Deprecated.This method does not work under Android VMs.<A extends java.lang.annotation.Annotation>
AgetAnnotation(java.lang.Class<A> annotationClass)
java.lang.annotation.Annotation[]
getAnnotations()
java.lang.annotation.Annotation[]
getDeclaredAnnotations()
java.lang.Class<? super T>
getDeclaringClass()
ImmutableList<TypeToken<? extends java.lang.Throwable>>
getExceptionTypes()
Returns all declared exception types of thisInvokable
.int
getModifiers()
java.lang.String
getName()
TypeToken<T>
getOwnerType()
Returns the type ofT
.ImmutableList<Parameter>
getParameters()
Returns all declared parameters of thisInvokable
.TypeToken<? extends R>
getReturnType()
Returns the return type of thisInvokable
.abstract java.lang.reflect.TypeVariable<?>[]
getTypeParameters()
SeeGenericDeclaration.getTypeParameters()
.int
hashCode()
R
invoke(T receiver, @Nullable java.lang.Object... args)
Invokes withreceiver
as 'this' andargs
passed to the underlying method and returns the return value; or calls the underlying constructor withargs
and returns the constructed instance.boolean
isAbstract()
Returns true if the method is abstract.boolean
isAccessible()
SeeAccessibleObject.isAccessible()
.boolean
isAnnotationPresent(java.lang.Class<? extends java.lang.annotation.Annotation> annotationClass)
boolean
isFinal()
Returnstrue
if this method is final, perModifier.isFinal(getModifiers())
.boolean
isNative()
Returns true if the element is native.abstract boolean
isOverridable()
Returnstrue
if this is an overridable method.boolean
isPackagePrivate()
Returns true if the element is package-private.boolean
isPrivate()
Returns true if the element is private.boolean
isProtected()
Returns true if the element is protected.boolean
isPublic()
Returns true if the element is public.boolean
isStatic()
Returns true if the element is static.boolean
isSynchronized()
Returns true if the method is synchronized.boolean
isSynthetic()
abstract boolean
isVarArgs()
Returnstrue
if this was declared to take a variable number of arguments.<R1 extends R>
Invokable<T,R1>returning(TypeToken<R1> returnType)
Explicitly specifies the return type of thisInvokable
.<R1 extends R>
Invokable<T,R1>returning(java.lang.Class<R1> returnType)
Explicitly specifies the return type of thisInvokable
.void
setAccessible(boolean flag)
SeeAccessibleObject.setAccessible(boolean)
.java.lang.String
toString()
boolean
trySetAccessible()
SeeAccessibleObject.trySetAccessible()
.
-
-
-
Method Detail
-
from
public static Invokable<?,java.lang.Object> from(java.lang.reflect.Method method)
ReturnsInvokable
ofmethod
.
-
from
public static <T> Invokable<T,T> from(java.lang.reflect.Constructor<T> constructor)
ReturnsInvokable
ofconstructor
.
-
isAnnotationPresent
public final boolean isAnnotationPresent(java.lang.Class<? extends java.lang.annotation.Annotation> annotationClass)
- Specified by:
isAnnotationPresent
in interfacejava.lang.reflect.AnnotatedElement
-
getAnnotation
@CheckForNull public final <A extends java.lang.annotation.Annotation> A getAnnotation(java.lang.Class<A> annotationClass)
- Specified by:
getAnnotation
in interfacejava.lang.reflect.AnnotatedElement
-
getAnnotations
public final java.lang.annotation.Annotation[] getAnnotations()
- Specified by:
getAnnotations
in interfacejava.lang.reflect.AnnotatedElement
-
getDeclaredAnnotations
public final java.lang.annotation.Annotation[] getDeclaredAnnotations()
- Specified by:
getDeclaredAnnotations
in interfacejava.lang.reflect.AnnotatedElement
-
getTypeParameters
public abstract java.lang.reflect.TypeVariable<?>[] getTypeParameters()
SeeGenericDeclaration.getTypeParameters()
.
-
setAccessible
public final void setAccessible(boolean flag)
SeeAccessibleObject.setAccessible(boolean)
.
-
trySetAccessible
public final boolean trySetAccessible()
SeeAccessibleObject.trySetAccessible()
.
-
isAccessible
public final boolean isAccessible()
SeeAccessibleObject.isAccessible()
.
-
getName
public final java.lang.String getName()
- Specified by:
getName
in interfacejava.lang.reflect.Member
-
getModifiers
public final int getModifiers()
- Specified by:
getModifiers
in interfacejava.lang.reflect.Member
-
isSynthetic
public final boolean isSynthetic()
- Specified by:
isSynthetic
in interfacejava.lang.reflect.Member
-
isPublic
public final boolean isPublic()
Returns true if the element is public.
-
isProtected
public final boolean isProtected()
Returns true if the element is protected.
-
isPackagePrivate
public final boolean isPackagePrivate()
Returns true if the element is package-private.
-
isPrivate
public final boolean isPrivate()
Returns true if the element is private.
-
isStatic
public final boolean isStatic()
Returns true if the element is static.
-
isFinal
public final boolean isFinal()
Returnstrue
if this method is final, perModifier.isFinal(getModifiers())
.Note that a method may still be effectively "final", or non-overridable when it has no
final
keyword. For example, it could be private, or it could be declared by a final class. To tell whether a method is overridable, useisOverridable()
.
-
isAbstract
public final boolean isAbstract()
Returns true if the method is abstract.
-
isNative
public final boolean isNative()
Returns true if the element is native.
-
isSynchronized
public final boolean isSynchronized()
Returns true if the method is synchronized.
-
equals
public boolean equals(@CheckForNull java.lang.Object obj)
- Overrides:
equals
in classjava.lang.Object
-
hashCode
public int hashCode()
- Overrides:
hashCode
in classjava.lang.Object
-
toString
public java.lang.String toString()
- Overrides:
toString
in classjava.lang.Object
-
isOverridable
public abstract boolean isOverridable()
Returnstrue
if this is an overridable method. Constructors, private, static or final methods, or methods declared by final classes are not overridable.
-
isVarArgs
public abstract boolean isVarArgs()
Returnstrue
if this was declared to take a variable number of arguments.
-
invoke
@CanIgnoreReturnValue @CheckForNull public final R invoke(@CheckForNull T receiver, @Nullable java.lang.Object... args) throws java.lang.reflect.InvocationTargetException, java.lang.IllegalAccessException
Invokes withreceiver
as 'this' andargs
passed to the underlying method and returns the return value; or calls the underlying constructor withargs
and returns the constructed instance.- Throws:
java.lang.IllegalAccessException
- if thisConstructor
object enforces Java language access control and the underlying method or constructor is inaccessible.java.lang.IllegalArgumentException
- if the number of actual and formal parameters differ; if an unwrapping conversion for primitive arguments fails; or if, after possible unwrapping, a parameter value cannot be converted to the corresponding formal parameter type by a method invocation conversion.java.lang.reflect.InvocationTargetException
- if the underlying method or constructor throws an exception.
-
getReturnType
public final TypeToken<? extends R> getReturnType()
Returns the return type of thisInvokable
.
-
getParameters
public final ImmutableList<Parameter> getParameters()
Returns all declared parameters of thisInvokable
. Note that if this is a constructor of a non-static inner class, unlikeConstructor.getParameterTypes()
, the hiddenthis
parameter of the enclosing class is excluded from the returned parameters.
-
getExceptionTypes
public final ImmutableList<TypeToken<? extends java.lang.Throwable>> getExceptionTypes()
Returns all declared exception types of thisInvokable
.
-
returning
public final <R1 extends R> Invokable<T,R1> returning(java.lang.Class<R1> returnType)
Explicitly specifies the return type of thisInvokable
. For example:Method factoryMethod = Person.class.getMethod("create"); Invokable<?, Person> factory = Invokable.of(getNameMethod).returning(Person.class);
-
returning
public final <R1 extends R> Invokable<T,R1> returning(TypeToken<R1> returnType)
Explicitly specifies the return type of thisInvokable
.
-
getDeclaringClass
public final java.lang.Class<? super T> getDeclaringClass()
- Specified by:
getDeclaringClass
in interfacejava.lang.reflect.Member
-
getOwnerType
public TypeToken<T> getOwnerType()
Returns the type ofT
.
-
getAnnotatedReturnType
@Deprecated @Beta public abstract java.lang.reflect.AnnotatedType getAnnotatedReturnType()
Deprecated.This method does not work under Android VMs. It is safe to use from guava-jre, but this copy in guava-android is not safe to use.Returns theAnnotatedType
for the return type.This method will fail if run under an Android VM.
- Since:
- NEXT for guava-android (available since 14.0 in guava-jre)
-
-