From 8f045307f5881ebbdba50d2db3fd1d4845597e84 Mon Sep 17 00:00:00 2001 From: wentch <22250530@qq.com> Date: Thu, 17 Dec 2015 14:47:36 +0800 Subject: [PATCH] --- src/org/redkale/convert/DeMember.java | 4 + src/org/redkale/convert/ObjectDecoder.java | 101 ++++++++++++++++++--- src/org/redkale/util/Creator.java | 12 ++- 3 files changed, 100 insertions(+), 17 deletions(-) diff --git a/src/org/redkale/convert/DeMember.java b/src/org/redkale/convert/DeMember.java index 6e31ce2df..4f94b28a1 100644 --- a/src/org/redkale/convert/DeMember.java +++ b/src/org/redkale/convert/DeMember.java @@ -35,6 +35,10 @@ public final class DeMember implements Comparable getAttribute() { return this.attribute; } diff --git a/src/org/redkale/convert/ObjectDecoder.java b/src/org/redkale/convert/ObjectDecoder.java index 5118c925f..d2f161795 100644 --- a/src/org/redkale/convert/ObjectDecoder.java +++ b/src/org/redkale/convert/ObjectDecoder.java @@ -5,6 +5,7 @@ */ package org.redkale.convert; +import java.beans.*; import static org.redkale.convert.ObjectEncoder.TYPEZERO; import org.redkale.util.Creator; import java.lang.reflect.*; @@ -12,6 +13,7 @@ import java.util.Arrays; import java.util.HashSet; import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; +import org.redkale.util.*; /** * @@ -29,6 +31,8 @@ public final class ObjectDecoder implements Decodeable creator; + protected DeMember[] creatorConstructorMembers; + protected DeMember[] members; protected Factory factory; @@ -65,6 +69,7 @@ public final class ObjectDecoder implements Decodeable list = new HashSet(); try { ConvertColumnEntry ref; @@ -99,6 +104,23 @@ public final class ObjectDecoder implements Decodeable[] ms = new DeMember[fields.length]; + for (int i = 0; i < fields.length; i++) { + for (DeMember m : this.members) { + if (m.attribute.field().equals(fields[i])) { + ms[i] = m; + break; + } + } + } + this.creatorConstructorMembers = ms; + } + } catch (Exception e) { //不存在则忽略 + } } catch (Exception ex) { throw new ConvertException(ex); } @@ -130,20 +152,75 @@ public final class ObjectDecoder implements Decodeable[] fields = this.creatorConstructorMembers; + final Object[] constructorParams = new Object[fields.length]; + final Object[][] otherParams = new Object[this.members.length][2]; + final AtomicInteger index = new AtomicInteger(); + int oc = 0; + while (in.hasNext()) { + DeMember member = in.readField(index, members); + in.skipBlank(); + if (member == null) { + in.skipValue(); //跳过该属性的值 + } else { + Object val = member.read(in); + boolean flag = true; + for (int i = 0; i < fields.length; i++) { + if (member == fields[i]) { + constructorParams[i] = val; + flag = false; + break; + } + } + if (flag) otherParams[oc++] = new Object[]{member.attribute, val}; + } + index.incrementAndGet(); + } + in.readObjectE(); + for (int i = 0; i < fields.length; i++) { + final Class t = fields[i].attribute.type(); + if (t.isPrimitive() && constructorParams[i] == null) { + Object a = 0; + if (t == boolean.class) { + a = Boolean.FALSE; + } else if (t == byte.class) { + a = (byte) 0; + } else if (t == short.class) { + a = (short) 0; + } else if (t == char.class) { + a = (char) 0; + } else if (t == long.class) { + a = (long) 0L; + } else if (t == float.class) { + a = (float) 0.0f; + } else if (t == double.class) { + a = (double) 0.0; + } + constructorParams[i] = a; + } + } + final T result = this.creator.create(constructorParams); + for (int i = 0; i < oc; i++) { + ((Attribute) otherParams[i][0]).set(result, otherParams[i][1]); + } + return result; } - in.readObjectE(); - return result; } @Override diff --git a/src/org/redkale/util/Creator.java b/src/org/redkale/util/Creator.java index 3791e6064..4d6c58c25 100644 --- a/src/org/redkale/util/Creator.java +++ b/src/org/redkale/util/Creator.java @@ -104,16 +104,18 @@ public interface Creator { mv.visitIntInsn(BIPUSH, i); } mv.visitInsn(AALOAD); - Class ct = params[i].getType(); - mv.visitTypeInsn(CHECKCAST, Type.getInternalName(ct)); + final Class ct = params[i].getType(); if (ct.isPrimitive()) { - Class fct = Array.get(Array.newInstance(ct, 1), 0).getClass(); + final Class bigct = Array.get(Array.newInstance(ct, 1), 0).getClass(); + mv.visitTypeInsn(CHECKCAST, bigct.getName().replace('.', '/')); try { - Method pm = ct.getMethod(ct.getSimpleName() + "Value"); - mv.visitMethodInsn(INVOKEVIRTUAL, fct.getName().replace('.', '/'), pm.getName(), Type.getMethodDescriptor(pm), false); + Method pm = bigct.getMethod(ct.getSimpleName() + "Value"); + mv.visitMethodInsn(INVOKEVIRTUAL, bigct.getName().replace('.', '/'), pm.getName(), Type.getMethodDescriptor(pm), false); } catch (Exception ex) { throw new RuntimeException(ex); //不可能会发生 } + } else { + mv.visitTypeInsn(CHECKCAST, ct.getName().replace('.', '/')); } } }