This commit is contained in:
wentch
2016-01-22 09:58:52 +08:00
parent 5059255bca
commit 782c161b07
3 changed files with 33 additions and 22 deletions

View File

@@ -129,12 +129,23 @@ public abstract class Factory<R extends Reader, W extends Writer> {
return this;
}
public ConvertColumnEntry findRef(AccessibleObject field) {
if (field == null) return null;
ConvertColumnEntry en = this.columnEntrys.get(field);
public ConvertColumnEntry findRef(AccessibleObject element) {
if (element == null) return null;
ConvertColumnEntry en = this.columnEntrys.get(element);
if (en != null) return en;
final ConvertType ct = this.getConvertType();
for (ConvertColumn ref : field.getAnnotationsByType(ConvertColumn.class)) {
ConvertColumn[] ccs = element.getAnnotationsByType(ConvertColumn.class);
if (ccs.length == 0 && element instanceof Method) {
final Method method = (Method) element;
String fieldName = readGetSetFieldName(method);
if (fieldName != null) {
try {
ccs = method.getDeclaringClass().getDeclaredField(fieldName).getAnnotationsByType(ConvertColumn.class);
} catch (Exception e) { //说明没有该字段,忽略异常
}
}
}
for (ConvertColumn ref : ccs) {
if (ref.type().contains(ct)) {
ConvertColumnEntry entry = new ConvertColumnEntry(ref);
if (skipAllIgnore) {
@@ -142,13 +153,26 @@ public abstract class Factory<R extends Reader, W extends Writer> {
return entry;
}
if (skipIgnores.isEmpty()) return entry;
if (skipIgnores.contains(((Member) field).getDeclaringClass())) entry.setIgnore(false);
if (skipIgnores.contains(((Member) element).getDeclaringClass())) entry.setIgnore(false);
return entry;
}
}
return null;
}
static String readGetSetFieldName(Method method) {
if (method == null) return null;
String fname = method.getName();
if (!fname.startsWith("is") && !fname.startsWith("get") && !fname.startsWith("set")) return fname;
fname = fname.substring(fname.startsWith("is") ? 2 : 3);
if (fname.length() > 1 && !(fname.charAt(1) >= 'A' && fname.charAt(1) <= 'Z')) {
fname = Character.toLowerCase(fname.charAt(0)) + fname.substring(1);
} else if (fname.length() == 1) {
fname = "" + Character.toLowerCase(fname.charAt(0));
}
return fname;
}
final String getEntity(Class clazz) {
ConvertEntity ce = (ConvertEntity) clazz.getAnnotation(ConvertEntity.class);
if (ce != null && findEntity(ce.value()) == null) entitys.put(ce.value(), clazz);

View File

@@ -87,7 +87,7 @@ public final class ObjectDecoder<R extends Reader, T> implements Decodeable<R, T
if (!method.getName().startsWith("set")) continue;
if (method.getParameterTypes().length != 1) continue;
if (method.getReturnType() != void.class) continue;
if (reversible && (cps == null || !ObjectEncoder.contains(cps, ObjectEncoder.readGetSetFieldName(method)))) {
if (reversible && (cps == null || !ObjectEncoder.contains(cps, Factory.readGetSetFieldName(method)))) {
boolean is = method.getParameterTypes()[0] == boolean.class || method.getParameterTypes()[0] == Boolean.class;
try {
clazz.getMethod(method.getName().replaceFirst("set", is ? "is" : "get"));

View File

@@ -80,7 +80,7 @@ public final class ObjectEncoder<W extends Writer, T> implements Encodeable<W, T
if (!method.getName().startsWith("is") && !method.getName().startsWith("get")) continue;
if (method.getParameterTypes().length != 0) continue;
if (method.getReturnType() == void.class) continue;
if (reversible && (cps == null || !contains(cps, readGetSetFieldName(method)))) {
if (reversible && (cps == null || !contains(cps, Factory.readGetSetFieldName(method)))) {
boolean is = method.getName().startsWith("is");
try {
clazz.getMethod(method.getName().replaceFirst(is ? "is" : "get", "set"), method.getReturnType());
@@ -237,19 +237,6 @@ public final class ObjectEncoder<W extends Writer, T> implements Encodeable<W, T
return false;
}
static String readGetSetFieldName(Method method) {
if (method == null) return null;
String fname = method.getName();
if (!fname.startsWith("is") && !fname.startsWith("get") && !fname.startsWith("set")) return fname;
fname = fname.substring(fname.startsWith("is") ? 2 : 3);
if (fname.length() > 1 && !(fname.charAt(1) >= 'A' && fname.charAt(1) <= 'Z')) {
fname = Character.toLowerCase(fname.charAt(0)) + fname.substring(1);
} else if (fname.length() == 1) {
fname = "" + Character.toLowerCase(fname.charAt(0));
}
return fname;
}
static String[] findConstructorProperties(Creator creator) {
try {
Creator.ConstructorParameters cps = creator.getClass().getMethod("create", Object[].class).getAnnotation(Creator.ConstructorParameters.class);
@@ -266,7 +253,7 @@ public final class ObjectEncoder<W extends Writer, T> implements Encodeable<W, T
fieldalias = ref == null || ref.name().isEmpty() ? field.getName() : ref.name();
} else if (getter != null) {
ConvertColumnEntry ref = factory.findRef(getter);
String mfieldname = readGetSetFieldName(getter);
String mfieldname = Factory.readGetSetFieldName(getter);
if (ref == null) {
try {
ref = factory.findRef(clazz.getDeclaredField(mfieldname));
@@ -276,7 +263,7 @@ public final class ObjectEncoder<W extends Writer, T> implements Encodeable<W, T
fieldalias = ref == null || ref.name().isEmpty() ? mfieldname : ref.name();
} else { // setter != null
ConvertColumnEntry ref = factory.findRef(setter);
String mfieldname = readGetSetFieldName(setter);
String mfieldname = Factory.readGetSetFieldName(setter);
if (ref == null) {
try {
ref = factory.findRef(clazz.getDeclaredField(mfieldname));