All reflection magic now :-(
Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/30dfdab7 Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/30dfdab7 Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/30dfdab7 Branch: refs/heads/JCLOUDS-427-1.6.x Commit: 30dfdab779d6d1bd69f152fb7a958ab7e4e80401 Parents: 476c0fb Author: Andrew Phillips <[email protected]> Authored: Fri Jan 24 14:41:19 2014 -0500 Committer: Andrew Phillips <[email protected]> Committed: Fri Jan 24 14:43:33 2014 -0500 ---------------------------------------------------------------------- .../main/java/org/jclouds/util/TypeToken2.java | 37 +++++++++++++++----- 1 file changed, 29 insertions(+), 8 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jclouds/blob/30dfdab7/core/src/main/java/org/jclouds/util/TypeToken2.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/jclouds/util/TypeToken2.java b/core/src/main/java/org/jclouds/util/TypeToken2.java index 99e47e5..d63ea0e 100644 --- a/core/src/main/java/org/jclouds/util/TypeToken2.java +++ b/core/src/main/java/org/jclouds/util/TypeToken2.java @@ -16,6 +16,7 @@ */ package org.jclouds.util; +import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; @@ -27,7 +28,6 @@ import org.jclouds.reflect.Reflection2; import com.google.common.collect.ImmutableMap; import com.google.common.reflect.Invokable; import com.google.common.reflect.TypeParameter; -import com.google.common.reflect.TypeResolver; import com.google.common.reflect.TypeToken; /* @@ -43,24 +43,45 @@ public class TypeToken2<T> extends TypeToken<T> { @SuppressWarnings("unchecked") public <X, Y> TypeToken<T> where(TypeParameter2<X> typeParam1, TypeToken<X> typeArg1, TypeParameter2<Y> typeParam2, TypeToken<Y> typeArg2) { - // resolving both parameters in one shot seems to work around 1635 - TypeResolver resolver = new TypeResolver(); - // where(Map) is package-private in TypeResolver - Invokable<TypeResolver, TypeResolver> whereWithMap = - Reflection2.<TypeResolver, TypeResolver>method(TypeResolver.class, "where", - Map.class); + /* + * Resolving both parameters in one shot seems to work around 1635, but + * TypeResolver and where(Map) are package-private in Guava 14.x + */ + Type resolvedType; try { + Object resolver = newTypeResolver(); + Invokable<Object, Object> whereWithMap = Reflection2.method( + (Class<Object>) resolver.getClass(), "where", Map.class); resolver = whereWithMap.invoke(resolver, ImmutableMap.of( typeParam1.getTypeVariable(), typeArg1.getType(), typeParam2.getTypeVariable(), typeArg2.getType())); + Invokable<Object, Type> resolveType = Reflection2.method( + (Class<Object>) resolver.getClass(), "resolveType", Type.class); + resolvedType = resolveType.invoke(resolver, getType()); } catch (IllegalAccessException exception) { // should never happen throw new IllegalStateException(exception); } catch (InvocationTargetException exception) { // should never happen throw new IllegalStateException(exception); + } catch (SecurityException exception) { + // should never happen + throw new IllegalStateException(exception); + } catch (IllegalArgumentException exception) { + // should never happen + throw new IllegalStateException(exception); + } catch (NoSuchFieldException exception) { + // should never happen + throw new IllegalStateException(exception); } - return (TypeToken<T>) TypeToken.of(resolver.resolveType(getType())); + return (TypeToken<T>) TypeToken.of(resolvedType); + } + + private static Object newTypeResolver() throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException { + TypeToken<?> anyToken = TypeToken.of(Object.class); + Field typeResolverField = TypeToken.class.getDeclaredField("typeResolver"); + typeResolverField.setAccessible(true); + return typeResolverField.get(anyToken).getClass(); } public <X, Y> TypeToken<T> where(TypeParameter2<X> typeParam1, Class<X> typeArg1,
