Class 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.GenericDeclaration, java.lang.reflect.Member
    Direct Known Subclasses:
    Invokable.ConstructorInvokable, Invokable.MethodInvokable

    @Beta
    public abstract class Invokable<T,​R>
    extends Element
    implements java.lang.reflect.GenericDeclaration
    Wrapper around either a Method or a Constructor. Convenience API is provided to make common reflective operation easier to deal with, such as Element.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());
     
    Since:
    14.0
    • Constructor Detail

      • Invokable

        Invokable​(M member)
    • Method Detail

      • from

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

        public static <T> Invokable<T,​T> from​(java.lang.reflect.Constructor<T> constructor)
        Returns Invokable of constructor.
      • 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

        public final R invoke​(T receiver,
                              java.lang.Object... args)
                       throws java.lang.reflect.InvocationTargetException,
                              java.lang.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:
        java.lang.IllegalAccessException - if this Constructor 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 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 java.lang.Throwable>> getExceptionTypes()
        Returns all declared exception types of this Invokable.
      • returning

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

        public final java.lang.Class<? super T> getDeclaringClass()
        Specified by:
        getDeclaringClass in interface java.lang.reflect.Member
        Overrides:
        getDeclaringClass in class Element
      • invokeInternal

        abstract java.lang.Object invokeInternal​(java.lang.Object receiver,
                                                 java.lang.Object[] args)
                                          throws java.lang.reflect.InvocationTargetException,
                                                 java.lang.IllegalAccessException
        Throws:
        java.lang.reflect.InvocationTargetException
        java.lang.IllegalAccessException
      • getGenericParameterTypes

        abstract java.lang.reflect.Type[] getGenericParameterTypes()
      • getGenericExceptionTypes

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

        abstract java.lang.annotation.Annotation[][] getParameterAnnotations()
      • getGenericReturnType

        abstract java.lang.reflect.Type getGenericReturnType()