ConvertFactory优化

This commit is contained in:
redkale
2023-01-31 17:05:26 +08:00
parent be5da6e287
commit c6a1d584ea

View File

@@ -665,30 +665,40 @@ public abstract class ConvertFactory<R extends Reader, W extends Writer> {
continue; continue;
} }
Encodeable encoder = null; Encodeable encoder = null;
Creator<? extends Encodeable> creator = Creator.create(enClazz); try {
Class[] paramTypes = creator.paramTypes(); Field instanceField = enClazz.getField("instance");
if (paramTypes.length == 0) { if (instanceField.getType() == enClazz && Modifier.isStatic(instanceField.getModifiers())) {
encoder = creator.create(); RedkaleClassLoader.putReflectionField("instance", instanceField);
} else if (paramTypes.length == 1) { encoder = (Encodeable) instanceField.get(null);
if (Type.class.isAssignableFrom(paramTypes[0])) {
encoder = creator.create((Object) colType);
} else if (ConvertFactory.class.isAssignableFrom(paramTypes[0])) {
encoder = creator.create(this);
} else {
throw new ConvertException(enClazz + " not found public empty-parameter Constructor");
} }
} else if (paramTypes.length == 2) { } catch (Exception e) {
if (ConvertFactory.class.isAssignableFrom(paramTypes[0]) && Type.class.isAssignableFrom(paramTypes[1])) { }
encoder = creator.create(this, colType); if (encoder == null) {
} else if (Type.class.isAssignableFrom(paramTypes[0]) && ConvertFactory.class.isAssignableFrom(paramTypes[1])) { Creator<? extends Encodeable> creator = Creator.create(enClazz);
encoder = creator.create(colType, this); Class[] paramTypes = creator.paramTypes();
} else { if (paramTypes.length == 0) {
throw new ConvertException(enClazz + " not found public empty-parameter Constructor"); encoder = creator.create();
} } else if (paramTypes.length == 1) {
} else { if (Type.class.isAssignableFrom(paramTypes[0])) {
throw new ConvertException(enClazz + " not found public empty-parameter Constructor"); encoder = creator.create((Object) colType);
} else if (ConvertFactory.class.isAssignableFrom(paramTypes[0])) {
encoder = creator.create(this);
} else {
throw new ConvertException(enClazz + " not found public empty-parameter Constructor");
}
} else if (paramTypes.length == 2) {
if (ConvertFactory.class.isAssignableFrom(paramTypes[0]) && Type.class.isAssignableFrom(paramTypes[1])) {
encoder = creator.create(this, colType);
} else if (Type.class.isAssignableFrom(paramTypes[0]) && ConvertFactory.class.isAssignableFrom(paramTypes[1])) {
encoder = creator.create(colType, this);
} else {
throw new ConvertException(enClazz + " not found public empty-parameter Constructor");
}
} else {
throw new ConvertException(enClazz + " not found public empty-parameter Constructor");
}
RedkaleClassLoader.putReflectionPublicConstructors(enClazz, enClazz.getName());
} }
RedkaleClassLoader.putReflectionPublicConstructors(enClazz, enClazz.getName());
if (encoderList == null) { if (encoderList == null) {
encoderList = new ArrayList<>(); encoderList = new ArrayList<>();
} }
@@ -716,30 +726,40 @@ public abstract class ConvertFactory<R extends Reader, W extends Writer> {
continue; continue;
} }
Decodeable decoder = null; Decodeable decoder = null;
Creator<? extends Decodeable> creator = Creator.create(deClazz); try {
Class[] paramTypes = creator.paramTypes(); Field instanceField = deClazz.getField("instance");
if (paramTypes.length == 0) { if (instanceField.getType() == deClazz && Modifier.isStatic(instanceField.getModifiers())) {
decoder = creator.create(); RedkaleClassLoader.putReflectionField("instance", instanceField);
} else if (paramTypes.length == 1) { decoder = (Decodeable) instanceField.get(null);
if (Type.class.isAssignableFrom(paramTypes[0])) {
decoder = creator.create((Object) colType);
} else if (ConvertFactory.class.isAssignableFrom(paramTypes[0])) {
decoder = creator.create(this);
} else {
throw new ConvertException(deClazz + " not found public empty-parameter Constructor");
} }
} else if (paramTypes.length == 2) { } catch (Exception e) {
if (ConvertFactory.class.isAssignableFrom(paramTypes[0]) && Type.class.isAssignableFrom(paramTypes[1])) { }
decoder = creator.create(this, colType); if (decoder == null) {
} else if (Type.class.isAssignableFrom(paramTypes[0]) && ConvertFactory.class.isAssignableFrom(paramTypes[1])) { Creator<? extends Decodeable> creator = Creator.create(deClazz);
decoder = creator.create(colType, this); Class[] paramTypes = creator.paramTypes();
} else { if (paramTypes.length == 0) {
throw new ConvertException(deClazz + " not found public empty-parameter Constructor"); decoder = creator.create();
} } else if (paramTypes.length == 1) {
} else { if (Type.class.isAssignableFrom(paramTypes[0])) {
throw new ConvertException(deClazz + " not found public empty-parameter Constructor"); decoder = creator.create((Object) colType);
} else if (ConvertFactory.class.isAssignableFrom(paramTypes[0])) {
decoder = creator.create(this);
} else {
throw new ConvertException(deClazz + " not found public empty-parameter Constructor");
}
} else if (paramTypes.length == 2) {
if (ConvertFactory.class.isAssignableFrom(paramTypes[0]) && Type.class.isAssignableFrom(paramTypes[1])) {
decoder = creator.create(this, colType);
} else if (Type.class.isAssignableFrom(paramTypes[0]) && ConvertFactory.class.isAssignableFrom(paramTypes[1])) {
decoder = creator.create(colType, this);
} else {
throw new ConvertException(deClazz + " not found public empty-parameter Constructor");
}
} else {
throw new ConvertException(deClazz + " not found public empty-parameter Constructor");
}
RedkaleClassLoader.putReflectionPublicConstructors(deClazz, deClazz.getName());
} }
RedkaleClassLoader.putReflectionPublicConstructors(deClazz, deClazz.getName());
if (decoderList == null) { if (decoderList == null) {
decoderList = new ArrayList<>(); decoderList = new ArrayList<>();
} }