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:
AnnotatedElement, Member
Direct Known Subclasses:
Invokable.ConstructorInvokable, Invokable.MethodInvokable

public abstract class Invokable<T,R> extends Object implements AnnotatedElement, Member
Wrapper around either a Method or a Constructor. Convenience API is provided to make common reflective operation easier to deal with, such as isPublic(), getParameters() etc.

In addition to convenience methods, TypeToken.method(java.lang.reflect.Method) and TypeToken.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 and GenericDeclaration. 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 or GenericDeclaration since 31.0)
  • Field Details

    • accessibleObject

      private final AccessibleObject accessibleObject
    • member

      private final Member member
    • ANNOTATED_TYPE_EXISTS

      private static final boolean ANNOTATED_TYPE_EXISTS
  • Constructor Details

    • Invokable

      Invokable(M member)
  • Method Details

    • from

      public static Invokable<?,Object> from(Method method)
      Returns Invokable of method.
    • from

      public static <T> Invokable<T,T> from(Constructor<T> constructor)
      Returns Invokable of constructor.
    • isAnnotationPresent

      public final boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)
      Specified by:
      isAnnotationPresent in interface AnnotatedElement
    • getAnnotation

      @CheckForNull public final <A extends Annotation> A getAnnotation(Class<A> annotationClass)
      Specified by:
      getAnnotation in interface AnnotatedElement
    • getAnnotations

      public final Annotation[] getAnnotations()
      Specified by:
      getAnnotations in interface AnnotatedElement
    • getDeclaredAnnotations

      public final Annotation[] getDeclaredAnnotations()
      Specified by:
      getDeclaredAnnotations in interface AnnotatedElement
    • getTypeParameters

      public abstract TypeVariable<?>[] getTypeParameters()
    • setAccessible

      public final void setAccessible(boolean flag)
    • trySetAccessible

      public final boolean trySetAccessible()
    • isAccessible

      public final boolean isAccessible()
    • getName

      public final String getName()
      Specified by:
      getName in interface Member
    • getModifiers

      public final int getModifiers()
      Specified by:
      getModifiers in interface Member
    • isSynthetic

      public final boolean isSynthetic()
      Specified by:
      isSynthetic in interface 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()
      Returns true if this method is final, per Modifier.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, use isOverridable().

    • 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.
    • isVolatile

      final boolean isVolatile()
      Returns true if the field is volatile.
    • isTransient

      final boolean isTransient()
      Returns true if the field is transient.
    • equals

      public boolean equals(@CheckForNull Object obj)
      Overrides:
      equals in class Object
    • hashCode

      public int hashCode()
      Overrides:
      hashCode in class Object
    • toString

      public String toString()
      Overrides:
      toString in class Object
    • isOverridable

      public abstract boolean isOverridable()
      Returns true 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()
      Returns true if this was declared to take a variable number of arguments.
    • invoke

      @CheckForNull public final R invoke(@CheckForNull T receiver, Object... args) throws InvocationTargetException, IllegalAccessException
      Invokes with receiver as 'this' and args passed to the underlying method and returns the return value; or calls the underlying constructor with args and returns the constructed instance.
      Throws:
      IllegalAccessException - if this Constructor object enforces Java language access control and the underlying method or constructor is inaccessible.
      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.
      InvocationTargetException - if the underlying method or constructor throws an exception.
    • getReturnType

      public final TypeToken<? extends R> getReturnType()
      Returns the return type of this Invokable.
    • getParameters

      public final ImmutableList<Parameter> getParameters()
      Returns all declared parameters of this Invokable. Note that if this is a constructor of a non-static inner class, unlike Constructor.getParameterTypes(), the hidden this parameter of the enclosing class is excluded from the returned parameters.
    • getExceptionTypes

      public final ImmutableList<TypeToken<? extends Throwable>> getExceptionTypes()
      Returns all declared exception types of this Invokable.
    • returning

      public final <R1 extends R> Invokable<T,R1> returning(Class<R1> returnType)
      Explicitly specifies the return type of this Invokable. 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 this Invokable.
    • getDeclaringClass

      public final Class<? super T> getDeclaringClass()
      Specified by:
      getDeclaringClass in interface Member
    • getOwnerType

      public TypeToken<T> getOwnerType()
      Returns the type of T.
    • invokeInternal

      @CheckForNull abstract Object invokeInternal(@CheckForNull Object receiver, Object[] args) throws InvocationTargetException, IllegalAccessException
      Throws:
      InvocationTargetException
      IllegalAccessException
    • getGenericParameterTypes

      abstract Type[] getGenericParameterTypes()
    • getAnnotatedParameterTypes

      abstract AnnotatedType[] getAnnotatedParameterTypes()
    • getGenericExceptionTypes

      abstract Type[] getGenericExceptionTypes()
      This should never return a type that's not a subtype of Throwable.
    • getParameterAnnotations

      abstract Annotation[][] getParameterAnnotations()
    • getGenericReturnType

      abstract Type getGenericReturnType()
    • getAnnotatedReturnType

      public abstract AnnotatedType getAnnotatedReturnType()
      Returns the AnnotatedType for the return type.
      Since:
      14.0
    • initAnnotatedTypeExists

      private static boolean initAnnotatedTypeExists()