优化getGenericType

This commit is contained in:
redkale
2023-10-10 00:09:58 +08:00
parent 404e1b8eee
commit 71a0a69bd3

View File

@@ -4,12 +4,10 @@
*/ */
package org.redkale.util; package org.redkale.util;
import java.lang.reflect.Type;
import java.lang.reflect.*; import java.lang.reflect.*;
import java.util.*; import java.util.*;
import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.ReentrantLock;
import static org.redkale.asm.ClassWriter.COMPUTE_FRAMES; import static org.redkale.asm.ClassWriter.COMPUTE_FRAMES;
import org.redkale.asm.*;
import static org.redkale.asm.Opcodes.*; import static org.redkale.asm.Opcodes.*;
/** /**
@@ -270,7 +268,7 @@ public abstract class TypeToken<T> {
* </pre> * </pre>
* *
* *
* @param paramType 泛型 * @param paramType 泛型
* @param declaringClass 泛型依附类 * @param declaringClass 泛型依附类
* *
* @return Type * @return Type
@@ -289,7 +287,7 @@ public abstract class TypeToken<T> {
Map<Type, Type> map = new HashMap<>(); Map<Type, Type> map = new HashMap<>();
parseType(map, declaringClass0); parseType(map, declaringClass0);
Type rstype = getType(map, paramType); Type rstype = getType(map, paramType);
if (rstype instanceof Class) { if (isClassType(rstype)) {
return rstype; return rstype;
} }
} }
@@ -410,6 +408,28 @@ public abstract class TypeToken<T> {
if (one == null) { if (one == null) {
return type; 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); return getType(map, one);
} }
@@ -614,9 +634,9 @@ public abstract class TypeToken<T> {
} catch (Throwable ex) { } catch (Throwable ex) {
} }
// ------------------------------------------------------------------------------ // ------------------------------------------------------------------------------
ClassWriter cw = new ClassWriter(COMPUTE_FRAMES); org.redkale.asm.ClassWriter cw = new org.redkale.asm.ClassWriter(COMPUTE_FRAMES);
FieldVisitor fv; org.redkale.asm.FieldVisitor fv;
MethodVisitor mv; org.redkale.asm.MethodVisitor mv;
cw.visit(V11, ACC_PUBLIC + ACC_FINAL + ACC_SUPER, newDynName, null, "java/lang/Object", null); cw.visit(V11, ACC_PUBLIC + ACC_FINAL + ACC_SUPER, newDynName, null, "java/lang/Object", null);
String rawTypeDesc = org.redkale.asm.Type.getDescriptor(rawType); String rawTypeDesc = org.redkale.asm.Type.getDescriptor(rawType);
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();