From 71a0a69bd3b6529b9a6637a16885756be2905e8f Mon Sep 17 00:00:00 2001 From: redkale Date: Tue, 10 Oct 2023 00:09:58 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96getGenericType?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/org/redkale/util/TypeToken.java | 34 +++++++++++++++---- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/redkale/util/TypeToken.java b/src/main/java/org/redkale/util/TypeToken.java index d4aa5a8c1..14949081f 100644 --- a/src/main/java/org/redkale/util/TypeToken.java +++ b/src/main/java/org/redkale/util/TypeToken.java @@ -4,12 +4,10 @@ */ package org.redkale.util; -import java.lang.reflect.Type; import java.lang.reflect.*; import java.util.*; import java.util.concurrent.locks.ReentrantLock; import static org.redkale.asm.ClassWriter.COMPUTE_FRAMES; -import org.redkale.asm.*; import static org.redkale.asm.Opcodes.*; /** @@ -270,7 +268,7 @@ public abstract class TypeToken { * * * - * @param paramType 泛型 + * @param paramType 泛型 * @param declaringClass 泛型依附类 * * @return Type @@ -289,7 +287,7 @@ public abstract class TypeToken { Map map = new HashMap<>(); parseType(map, declaringClass0); Type rstype = getType(map, paramType); - if (rstype instanceof Class) { + if (isClassType(rstype)) { return rstype; } } @@ -410,6 +408,28 @@ public abstract class TypeToken { if (one == null) { return type; } + if (one instanceof ParameterizedType && !isClassType(one)) { + ParameterizedType pt = (ParameterizedType) one; + Type owner = getType(map, pt.getOwnerType()); + if (owner == null || isClassType(owner)) { + Type raw = getType(map, pt.getRawType()); + if (raw == null || isClassType(raw)) { + Type[] os = pt.getActualTypeArguments(); + Type[] ns = new Type[os.length]; + boolean allClass = true; + for (int i = 0; i < ns.length; i++) { + ns[i] = getType(map, os[i]); + if (!isClassType(ns[i])) { + allClass = false; + break; + } + } + if (allClass) { + return createParameterizedType(owner, raw, ns); + } + } + } + } return getType(map, one); } @@ -614,9 +634,9 @@ public abstract class TypeToken { } catch (Throwable ex) { } // ------------------------------------------------------------------------------ - ClassWriter cw = new ClassWriter(COMPUTE_FRAMES); - FieldVisitor fv; - MethodVisitor mv; + org.redkale.asm.ClassWriter cw = new org.redkale.asm.ClassWriter(COMPUTE_FRAMES); + org.redkale.asm.FieldVisitor fv; + org.redkale.asm.MethodVisitor mv; cw.visit(V11, ACC_PUBLIC + ACC_FINAL + ACC_SUPER, newDynName, null, "java/lang/Object", null); String rawTypeDesc = org.redkale.asm.Type.getDescriptor(rawType); StringBuilder sb = new StringBuilder();