优化getGenericType
This commit is contained in:
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user