优化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;
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<T> {
* </pre>
*
*
* @param paramType 泛型
* @param paramType 泛型
* @param declaringClass 泛型依附类
*
* @return Type
@@ -289,7 +287,7 @@ public abstract class TypeToken<T> {
Map<Type, Type> 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<T> {
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<T> {
} 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();