package com.cwa.util.automsg.codec;
import com.cwa.util.automsg.RequestFields;
import com.cwa.util.automsg.ResponseFields;
import java.lang.reflect.Field;
public class ReflectiveCodecBuilder {
// 根据注解构造Codec。
public static ReflectiveCodec build(Class<?> msgClass) {
ReflectiveCodec codec = new ReflectiveCodec();
RequestFields reqFieldsAnno = msgClass.getAnnotation(RequestFields.class);
if (reqFieldsAnno != null) {
for (String fieldSpec : reqFieldsAnno.value()) {
codec.addRequestField(parseSpec(msgClass, fieldSpec));
}
}
ResponseFields respFieldsAnno = msgClass.getAnnotation(ResponseFields.class);
if (respFieldsAnno != null) {
for (String fieldSpec : respFieldsAnno.value()) {
codec.addResponseField(parseSpec(msgClass, fieldSpec));
}
}
return codec;
}
private static ReflectiveField parseSpec(Class<?> msgClass, String fieldSpec) {
// field1 -> field2
if (fieldSpec.contains("->")) {
String[] specs = fieldSpec.split("->");
ReflectiveField field = parseSpec(msgClass, specs[0]);
field.setDependency(parseSpec(msgClass, specs[1]));
return field;
}
// field
try {
Field field = msgClass.getDeclaredField(fieldSpec.trim());
return new ReflectiveField(field);
} catch (NoSuchFieldException e) {
throw new RuntimeException("Field not found:" + fieldSpec, e);
}
}
}