Class Types.TypeVariableInvocationHandler

  • All Implemented Interfaces:
    java.lang.reflect.InvocationHandler
    Enclosing class:
    Types

    private static final class Types.TypeVariableInvocationHandler
    extends java.lang.Object
    implements java.lang.reflect.InvocationHandler
    Invocation handler to work around a compatibility problem between Java 7 and Java 8.

    Java 8 introduced a new method getAnnotatedBounds() in the TypeVariable interface, whose return type AnnotatedType[] is also new in Java 8. That means that we cannot implement that interface in source code in a way that will compile on both Java 7 and Java 8. If we include the getAnnotatedBounds() method then its return type means it won't compile on Java 7, while if we don't include the method then the compiler will complain that an abstract method is unimplemented. So instead we use a dynamic proxy to get an implementation. If the method being called on the TypeVariable instance has the same name as one of the public methods of Types.TypeVariableImpl, the proxy calls the same method on its instance of TypeVariableImpl. Otherwise it throws UnsupportedOperationException; this should only apply to getAnnotatedBounds(). This does mean that users on Java 8 who obtain an instance of TypeVariable from TypeResolver.resolveType(java.lang.reflect.Type) will not be able to call getAnnotatedBounds() on it, but that should hopefully be rare.

    This workaround should be removed at a distant future time when we no longer support Java versions earlier than 8.

    • Field Detail

      • typeVariableMethods

        private static final ImmutableMap<java.lang.String,​java.lang.reflect.Method> typeVariableMethods
    • Constructor Detail

    • Method Detail

      • invoke

        public java.lang.Object invoke​(java.lang.Object proxy,
                                       java.lang.reflect.Method method,
                                       java.lang.Object[] args)
                                throws java.lang.Throwable
        Specified by:
        invoke in interface java.lang.reflect.InvocationHandler
        Throws:
        java.lang.Throwable