diff --git a/src/org/redkale/convert/DeMember.java b/src/org/redkale/convert/DeMember.java index 673527a57..67ecb6cab 100644 --- a/src/org/redkale/convert/DeMember.java +++ b/src/org/redkale/convert/DeMember.java @@ -5,6 +5,7 @@ */ package org.redkale.convert; +import java.lang.reflect.*; import org.redkale.util.Attribute; /** @@ -33,6 +34,19 @@ public final class DeMember implements Comparable DeMember create(final Factory factory, final Class clazz, final String fieldname) { + try { + Field field = clazz.getDeclaredField(fieldname); + return new DeMember<>(Attribute.create(field), factory.loadDecoder(field.getGenericType())); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public final boolean match(String name) { + return attribute.field().equals(name); + } + public final void read(R in, T obj) { this.attribute.set(obj, decoder.convertFrom(in)); } diff --git a/src/org/redkale/convert/EnMember.java b/src/org/redkale/convert/EnMember.java index 9a2635710..2768ec71b 100644 --- a/src/org/redkale/convert/EnMember.java +++ b/src/org/redkale/convert/EnMember.java @@ -5,6 +5,7 @@ */ package org.redkale.convert; +import java.lang.reflect.*; import org.redkale.util.Attribute; /** @@ -38,6 +39,19 @@ public final class EnMember implements Comparable EnMember create(final Factory factory, final Class clazz, final String fieldname) { + try { + Field field = clazz.getDeclaredField(fieldname); + return new EnMember<>(Attribute.create(field), factory.loadEncoder(field.getGenericType())); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public final boolean match(String name) { + return attribute.field().equals(name); + } + public boolean write(final W out, final boolean comma, final T obj) { F value = attribute.get(obj); if (value == null) return comma; diff --git a/src/org/redkale/convert/Factory.java b/src/org/redkale/convert/Factory.java index 608b5cfbf..4437da54c 100644 --- a/src/org/redkale/convert/Factory.java +++ b/src/org/redkale/convert/Factory.java @@ -349,14 +349,15 @@ public abstract class Factory { od = new ObjectDecoder(type); decoder = od; } else if (!clazz.getName().startsWith("java.")) { - SimpledCoder simpleCoder = null; + Decodeable simpleCoder = null; for (final Method method : clazz.getDeclaredMethods()) { if (!Modifier.isStatic(method.getModifiers())) continue; - if (method.getParameterTypes().length != 0) continue; - if (!SimpledCoder.class.isAssignableFrom(method.getReturnType())) continue; + Class[] paramTypes = method.getParameterTypes(); + if (paramTypes.length != 1 || paramTypes[0] != Factory.class) continue; + if (!Decodeable.class.isAssignableFrom(method.getReturnType())) continue; try { method.setAccessible(true); - simpleCoder = (SimpledCoder) method.invoke(null); + simpleCoder = (Decodeable) method.invoke(null, this); break; } catch (Exception e) { } @@ -427,14 +428,15 @@ public abstract class Factory { } else if (clazz == Object.class) { return (Encodeable) this.anyEncoder; } else if (!clazz.getName().startsWith("java.")) { - SimpledCoder simpleCoder = null; + Encodeable simpleCoder = null; for (final Method method : clazz.getDeclaredMethods()) { if (!Modifier.isStatic(method.getModifiers())) continue; - if (method.getParameterTypes().length != 0) continue; - if (!SimpledCoder.class.isAssignableFrom(method.getReturnType())) continue; + Class[] paramTypes = method.getParameterTypes(); + if (paramTypes.length != 1 || paramTypes[0] != Factory.class) continue; + if (!Encodeable.class.isAssignableFrom(method.getReturnType())) continue; try { method.setAccessible(true); - simpleCoder = (SimpledCoder) method.invoke(null); + simpleCoder = (Encodeable) method.invoke(null, this); break; } catch (Exception e) { } diff --git a/src/org/redkale/convert/json/JsonByteBufferReader.java b/src/org/redkale/convert/json/JsonByteBufferReader.java index 39b26cca4..e8ce607ee 100644 --- a/src/org/redkale/convert/json/JsonByteBufferReader.java +++ b/src/org/redkale/convert/json/JsonByteBufferReader.java @@ -155,7 +155,7 @@ public class JsonByteBufferReader extends JsonReader { char ch = nextGoodChar(); if (ch == ',') return true; if (ch == '}' || ch == ']') return false; - backChar(ch); + backChar(ch); // { [ 交由 readObjectB 或 readMapB 或 readArrayB 读取 return true; } diff --git a/src/org/redkale/convert/json/JsonReader.java b/src/org/redkale/convert/json/JsonReader.java index 1d6d8aaa2..837066222 100644 --- a/src/org/redkale/convert/json/JsonReader.java +++ b/src/org/redkale/convert/json/JsonReader.java @@ -267,7 +267,7 @@ public class JsonReader implements Reader { if (ch == ',') return true; if (ch == '}' || ch == ']') return false; } - this.position--; + this.position--; // { [ 交由 readObjectB 或 readMapB 或 readArrayB 读取 return true; }