From 708cd5a64448c2c94074b25ed57f46a34344d918 Mon Sep 17 00:00:00 2001 From: Redkale <8730487+redkale@users.noreply.github.com> Date: Mon, 4 May 2020 22:12:25 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DDeMember/EnMember=E4=B8=ADatt?= =?UTF-8?q?ribute.type=E5=80=BC=E4=B8=8D=E8=83=BD=E7=B2=BE=E5=87=86?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E6=B3=9B=E5=9E=8B=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/org/redkale/convert/ObjectDecoder.java | 8 ++++---- src/org/redkale/convert/ObjectEncoder.java | 8 ++++---- src/org/redkale/util/Attribute.java | 16 ++++++++-------- src/org/redkale/util/TypeToken.java | 4 ++++ 4 files changed, 20 insertions(+), 16 deletions(-) diff --git a/src/org/redkale/convert/ObjectDecoder.java b/src/org/redkale/convert/ObjectDecoder.java index 7f4f03bb3..973c2b4c0 100644 --- a/src/org/redkale/convert/ObjectDecoder.java +++ b/src/org/redkale/convert/ObjectDecoder.java @@ -101,7 +101,7 @@ public class ObjectDecoder implements Decodeable { Type t = TypeToken.createClassType(TypeToken.getGenericType(field.getGenericType(), this.type), this.type); fieldCoder = factory.loadDecoder(t); } - DeMember member = new DeMember(ObjectEncoder.createAttribute(factory, clazz, field, null, null), fieldCoder); + DeMember member = new DeMember(ObjectEncoder.createAttribute(factory, type, clazz, field, null, null), fieldCoder); if (ref != null) member.index = ref.getIndex(); list.add(member); } @@ -131,7 +131,7 @@ public class ObjectDecoder implements Decodeable { Type t = TypeToken.createClassType(TypeToken.getGenericType(method.getGenericParameterTypes()[0], this.type), this.type); fieldCoder = factory.loadDecoder(t); } - DeMember member = new DeMember(ObjectEncoder.createAttribute(factory, clazz, null, null, method), fieldCoder); + DeMember member = new DeMember(ObjectEncoder.createAttribute(factory, type, clazz, null, null, method), fieldCoder); if (ref != null) member.index = ref.getIndex(); list.add(member); } @@ -149,7 +149,7 @@ public class ObjectDecoder implements Decodeable { try { Field f = clazz.getDeclaredField(constructorField); Type t = TypeToken.createClassType(f.getGenericType(), this.type); - list.add(new DeMember(ObjectEncoder.createAttribute(factory, clazz, f, null, null), factory.loadDecoder(t))); + list.add(new DeMember(ObjectEncoder.createAttribute(factory, type, clazz, f, null, null), factory.loadDecoder(t))); } catch (NoSuchFieldException nsfe) { //不存在field, 可能存在getter方法 char[] fs = constructorField.toCharArray(); fs[0] = Character.toUpperCase(fs[0]); @@ -161,7 +161,7 @@ public class ObjectDecoder implements Decodeable { getter = clazz.getMethod("is" + mn); } Type t = TypeToken.createClassType(TypeToken.getGenericType(getter.getGenericParameterTypes()[0], this.type), this.type); - list.add(new DeMember(ObjectEncoder.createAttribute(factory, clazz, null, getter, null), factory.loadDecoder(t))); + list.add(new DeMember(ObjectEncoder.createAttribute(factory, type, clazz, null, getter, null), factory.loadDecoder(t))); } } } diff --git a/src/org/redkale/convert/ObjectEncoder.java b/src/org/redkale/convert/ObjectEncoder.java index e22f275be..6cc3f3078 100644 --- a/src/org/redkale/convert/ObjectEncoder.java +++ b/src/org/redkale/convert/ObjectEncoder.java @@ -82,7 +82,7 @@ public class ObjectEncoder implements Encodeable { Type t = TypeToken.createClassType(TypeToken.getGenericType(field.getGenericType(), this.type), this.type); fieldCoder = factory.loadEncoder(t); } - EnMember member = new EnMember(createAttribute(factory, clazz, field, null, null), fieldCoder); + EnMember member = new EnMember(createAttribute(factory, type, clazz, field, null, null), fieldCoder); if (ref != null) member.index = ref.getIndex(); list.add(member); } @@ -111,7 +111,7 @@ public class ObjectEncoder implements Encodeable { Type t = TypeToken.createClassType(TypeToken.getGenericType(method.getGenericReturnType(), this.type), this.type); fieldCoder = factory.loadEncoder(t); } - EnMember member = new EnMember(createAttribute(factory, clazz, null, method, null), fieldCoder); + EnMember member = new EnMember(createAttribute(factory, type, clazz, null, method, null), fieldCoder); if (ref != null) member.index = ref.getIndex(); list.add(member); } @@ -263,7 +263,7 @@ public class ObjectEncoder implements Encodeable { } } - static Attribute createAttribute(final ConvertFactory factory, Class clazz, final Field field, final Method getter, final Method setter) { + static Attribute createAttribute(final ConvertFactory factory, Type realType, Class clazz, final Field field, final Method getter, final Method setter) { String fieldalias; if (field != null) { // public field ConvertColumnEntry ref = factory.findRef(clazz, field); @@ -289,7 +289,7 @@ public class ObjectEncoder implements Encodeable { } fieldalias = ref == null || ref.name().isEmpty() ? mfieldname : ref.name(); } - return Attribute.create(clazz, fieldalias, field, getter, setter); + return Attribute.create(realType, clazz, fieldalias, null, field, getter, setter, null); } } diff --git a/src/org/redkale/util/Attribute.java b/src/org/redkale/util/Attribute.java index 672f3ac3d..fe17bc435 100644 --- a/src/org/redkale/util/Attribute.java +++ b/src/org/redkale/util/Attribute.java @@ -636,7 +636,7 @@ public interface Attribute { * @return Attribute对象 */ @SuppressWarnings("unchecked") - public static Attribute create(Class subclass, final Class clazz, String fieldalias, final Class fieldtype, final java.lang.reflect.Field field, java.lang.reflect.Method getter, java.lang.reflect.Method setter, Object attach) { + public static Attribute create(java.lang.reflect.Type subclass, final Class clazz, String fieldalias, final Class fieldtype, final java.lang.reflect.Field field, java.lang.reflect.Method getter, java.lang.reflect.Method setter, Object attach) { if (subclass == null) subclass = clazz; if (fieldalias != null && fieldalias.isEmpty()) fieldalias = null; int mod = field == null ? java.lang.reflect.Modifier.STATIC : field.getModifiers(); @@ -687,7 +687,7 @@ public interface Attribute { final String fieldname = fieldalias; Class column = fieldtype; java.lang.reflect.Type generictype = fieldtype; - + if (tfield != null) { // public tfield column = tfield.getType(); generictype = tfield.getGenericType(); @@ -711,16 +711,16 @@ public interface Attribute { final Class pcolumn = column; if (column.isPrimitive()) column = java.lang.reflect.Array.get(java.lang.reflect.Array.newInstance(column, 1), 0).getClass(); final String supDynName = Attribute.class.getName().replace('.', '/'); - final String interName = subclass.getName().replace('.', '/'); + final String interName = TypeToken.typeToClass(subclass).getName().replace('.', '/'); final String columnName = column.getName().replace('.', '/'); - final String interDesc = Type.getDescriptor(subclass); + final String interDesc = Type.getDescriptor(TypeToken.typeToClass(subclass)); final String columnDesc = Type.getDescriptor(column); ClassLoader loader = Thread.currentThread().getContextClassLoader(); - String newDynName = supDynName + "_Dyn_" + subclass.getSimpleName() + "_" + String newDynName = supDynName + "_Dyn_" + TypeToken.typeToClass(subclass).getSimpleName() + "_" + fieldname.substring(fieldname.indexOf('.') + 1) + "_" + pcolumn.getSimpleName().replace("[]", "Array"); - if (String.class.getClassLoader() != subclass.getClassLoader()) { - loader = subclass.getClassLoader(); + if (String.class.getClassLoader() != TypeToken.typeToClass(subclass).getClassLoader()) { + loader = TypeToken.typeToClass(subclass).getClassLoader(); newDynName = interName + "_Dyn" + Attribute.class.getSimpleName() + "_" + fieldname.substring(fieldname.indexOf('.') + 1) + "_" + pcolumn.getSimpleName().replace("[]", "Array"); } @@ -804,7 +804,7 @@ public interface Attribute { } { //declaringClass 方法 mv = cw.visitMethod(ACC_PUBLIC, "declaringClass", "()Ljava/lang/Class;", null, null); - mv.visitLdcInsn(Type.getType(subclass)); + mv.visitLdcInsn(Type.getType(TypeToken.typeToClass(subclass))); mv.visitInsn(ARETURN); mv.visitMaxs(1, 1); mv.visitEnd(); diff --git a/src/org/redkale/util/TypeToken.java b/src/org/redkale/util/TypeToken.java index 3359206c0..2e8ec5eec 100644 --- a/src/org/redkale/util/TypeToken.java +++ b/src/org/redkale/util/TypeToken.java @@ -157,6 +157,10 @@ public abstract class TypeToken { && ((TypeVariable) type).getBounds()[0] instanceof Class && ((Class) ((TypeVariable) type).getBounds()[0]).isAssignableFrom((Class) atas[i])) return atas[i]; + if (atas[i] instanceof ParameterizedType + && ((TypeVariable) type).getBounds().length == 1 + && ((TypeVariable) type).getBounds()[0] == Object.class) + return atas[i]; } } ParameterizedType cycType = superPT;