You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by an...@apache.org on 2014/01/24 20:45:36 UTC
[2/2] git commit: All reflection magic now :-(
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 <an...@apache.org>
Authored: Fri Jan 24 14:41:19 2014 -0500
Committer: Andrew Phillips <an...@apache.org>
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,