From 2a3b8f87d3be077a64da8ef44a29441b7040dc3b Mon Sep 17 00:00:00 2001 From: Redkale <8730487+redkale@users.noreply.github.com> Date: Thu, 3 Jan 2019 09:06:08 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=BC=E5=AE=B9@Resource=E6=A0=87=E8=AE=B0?= =?UTF-8?q?=E5=9C=A8=E6=B3=9B=E5=9E=8B=E7=B1=BB=E5=9E=8B=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E4=B8=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/org/redkale/util/ResourceFactory.java | 3 ++- src/org/redkale/util/TypeToken.java | 21 +++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/org/redkale/util/ResourceFactory.java b/src/org/redkale/util/ResourceFactory.java index 19eccbecc..5d312bc25 100644 --- a/src/org/redkale/util/ResourceFactory.java +++ b/src/org/redkale/util/ResourceFactory.java @@ -570,7 +570,8 @@ public final class ResourceFactory { if (Modifier.isStatic(field.getModifiers())) continue; field.setAccessible(true); final Class classtype = field.getType(); - final Type genctype = field.getGenericType(); + final Type genctype = TypeToken.containsUnknownType(field.getGenericType()) + ? TypeToken.getGenericType(field.getGenericType(), src.getClass()) : field.getGenericType(); Resource rc = field.getAnnotation(Resource.class); if (rc == null) { //深度注入 boolean flag = true; //是否没有重复 diff --git a/src/org/redkale/util/TypeToken.java b/src/org/redkale/util/TypeToken.java index 79ceaacd9..f4b27a86e 100644 --- a/src/org/redkale/util/TypeToken.java +++ b/src/org/redkale/util/TypeToken.java @@ -56,6 +56,27 @@ public abstract class TypeToken { return true; } + public final static boolean containsUnknownType(final Type type) { + if (type == null) return false; + if (type instanceof Class) return false; + if (type instanceof WildcardType) return true; + if (type instanceof TypeVariable) return true; + if (type instanceof GenericArrayType) return containsUnknownType(((GenericArrayType) type).getGenericComponentType()); + if (type instanceof ParameterizedType) { + ParameterizedType pt = (ParameterizedType) type; + if (containsUnknownType(pt.getRawType())) return true; + if (containsUnknownType(pt.getOwnerType())) return true; + Type[] ts = pt.getActualTypeArguments(); + if (ts != null) { + for (Type t : ts) { + if (containsUnknownType(t)) return true; + } + } + return false; + } + return true; + } + public final static Class typeToClass(final Type type) { if (type instanceof Class) return (Class) type; if (type instanceof WildcardType) return null;