This commit is contained in:
@@ -5,6 +5,7 @@
|
|||||||
*/
|
*/
|
||||||
package org.redkale.convert;
|
package org.redkale.convert;
|
||||||
|
|
||||||
|
import java.lang.reflect.*;
|
||||||
import org.redkale.util.Attribute;
|
import org.redkale.util.Attribute;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -33,6 +34,19 @@ public final class DeMember<R extends Reader, T, F> implements Comparable<DeMemb
|
|||||||
this.decoder = decoder;
|
this.decoder = decoder;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static <R extends Reader, T, F> DeMember<R, T, F> create(final Factory factory, final Class<T> 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) {
|
public final void read(R in, T obj) {
|
||||||
this.attribute.set(obj, decoder.convertFrom(in));
|
this.attribute.set(obj, decoder.convertFrom(in));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
*/
|
*/
|
||||||
package org.redkale.convert;
|
package org.redkale.convert;
|
||||||
|
|
||||||
|
import java.lang.reflect.*;
|
||||||
import org.redkale.util.Attribute;
|
import org.redkale.util.Attribute;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -38,6 +39,19 @@ public final class EnMember<W extends Writer, T, F> implements Comparable<EnMemb
|
|||||||
//this.isnumber = Number.class.isAssignableFrom(t) || (!this.isbool && t.isPrimitive());
|
//this.isnumber = Number.class.isAssignableFrom(t) || (!this.isbool && t.isPrimitive());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static <W extends Writer, T, F> EnMember<W, T, F> create(final Factory factory, final Class<T> 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) {
|
public boolean write(final W out, final boolean comma, final T obj) {
|
||||||
F value = attribute.get(obj);
|
F value = attribute.get(obj);
|
||||||
if (value == null) return comma;
|
if (value == null) return comma;
|
||||||
|
|||||||
@@ -349,14 +349,15 @@ public abstract class Factory<R extends Reader, W extends Writer> {
|
|||||||
od = new ObjectDecoder(type);
|
od = new ObjectDecoder(type);
|
||||||
decoder = od;
|
decoder = od;
|
||||||
} else if (!clazz.getName().startsWith("java.")) {
|
} else if (!clazz.getName().startsWith("java.")) {
|
||||||
SimpledCoder simpleCoder = null;
|
Decodeable simpleCoder = null;
|
||||||
for (final Method method : clazz.getDeclaredMethods()) {
|
for (final Method method : clazz.getDeclaredMethods()) {
|
||||||
if (!Modifier.isStatic(method.getModifiers())) continue;
|
if (!Modifier.isStatic(method.getModifiers())) continue;
|
||||||
if (method.getParameterTypes().length != 0) continue;
|
Class[] paramTypes = method.getParameterTypes();
|
||||||
if (!SimpledCoder.class.isAssignableFrom(method.getReturnType())) continue;
|
if (paramTypes.length != 1 || paramTypes[0] != Factory.class) continue;
|
||||||
|
if (!Decodeable.class.isAssignableFrom(method.getReturnType())) continue;
|
||||||
try {
|
try {
|
||||||
method.setAccessible(true);
|
method.setAccessible(true);
|
||||||
simpleCoder = (SimpledCoder) method.invoke(null);
|
simpleCoder = (Decodeable) method.invoke(null, this);
|
||||||
break;
|
break;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
}
|
}
|
||||||
@@ -427,14 +428,15 @@ public abstract class Factory<R extends Reader, W extends Writer> {
|
|||||||
} else if (clazz == Object.class) {
|
} else if (clazz == Object.class) {
|
||||||
return (Encodeable<W, E>) this.anyEncoder;
|
return (Encodeable<W, E>) this.anyEncoder;
|
||||||
} else if (!clazz.getName().startsWith("java.")) {
|
} else if (!clazz.getName().startsWith("java.")) {
|
||||||
SimpledCoder simpleCoder = null;
|
Encodeable simpleCoder = null;
|
||||||
for (final Method method : clazz.getDeclaredMethods()) {
|
for (final Method method : clazz.getDeclaredMethods()) {
|
||||||
if (!Modifier.isStatic(method.getModifiers())) continue;
|
if (!Modifier.isStatic(method.getModifiers())) continue;
|
||||||
if (method.getParameterTypes().length != 0) continue;
|
Class[] paramTypes = method.getParameterTypes();
|
||||||
if (!SimpledCoder.class.isAssignableFrom(method.getReturnType())) continue;
|
if (paramTypes.length != 1 || paramTypes[0] != Factory.class) continue;
|
||||||
|
if (!Encodeable.class.isAssignableFrom(method.getReturnType())) continue;
|
||||||
try {
|
try {
|
||||||
method.setAccessible(true);
|
method.setAccessible(true);
|
||||||
simpleCoder = (SimpledCoder) method.invoke(null);
|
simpleCoder = (Encodeable) method.invoke(null, this);
|
||||||
break;
|
break;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -155,7 +155,7 @@ public class JsonByteBufferReader extends JsonReader {
|
|||||||
char ch = nextGoodChar();
|
char ch = nextGoodChar();
|
||||||
if (ch == ',') return true;
|
if (ch == ',') return true;
|
||||||
if (ch == '}' || ch == ']') return false;
|
if (ch == '}' || ch == ']') return false;
|
||||||
backChar(ch);
|
backChar(ch); // { [ 交由 readObjectB 或 readMapB 或 readArrayB 读取
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -267,7 +267,7 @@ public class JsonReader implements Reader {
|
|||||||
if (ch == ',') return true;
|
if (ch == ',') return true;
|
||||||
if (ch == '}' || ch == ']') return false;
|
if (ch == '}' || ch == ']') return false;
|
||||||
}
|
}
|
||||||
this.position--;
|
this.position--; // { [ 交由 readObjectB 或 readMapB 或 readArrayB 读取
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user