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.