不知道你的 @MyAnnotation 用以修饰哪个类,我这里假设是 OriginClass 吧.
以我个人来说,我会使用 AimClass.from(originClassInstance);
其实就是把你的工具类融合到目标类里.
理由:
转换逻辑只有 AimClass 需要,转换逻辑的输出即 AimClass,那么只需要把转换逻辑封装到该类中即可.
转换逻辑中,可以硬编码或者也通过 @MyAnnotation 注解来处理.但是注意,这里的 @MyAnnotation 应该修饰的是 AimClass 上的字段.
由于 1、2,如果映射关系发生变化,调用者完全无感,因为他依旧可以传入一个干净的 OriginClassInstance.
如果想做到 AimClass 不依赖 OriginClass 也是可以的(不然就需要 remote 反过来依赖 OriginClass 所在的包了,虽然可以通过 provide 解决但是终究看着闹心):
public class AimClass {
@MyAnnotation(name = "origin_id", type = String.class)
private String id;
public static AimClass from(Object object) {
AimClass aim = new AimClass();
Class tClass = object.getClass();
// 如果有反射工具类的话则更方便,不想依赖的话则用原始写法就好.
// 这一段应该跟你原先的转换代码差不多. 我就不多解释了.
// 异常捕捉我也没写,需要的就自己加一下.
Arrays.stream(
// 如果不支持 stream 那就换成 for 循环.
AimClass.class.getDeclaredFields()
)
.filter(f -> f.isAnnotationPresent(MyAnnotation.class))
.forEach(f -> {
f.setAccessible(true);
MyAnnotation myAnnotation = f.getAnnotation(MyAnnotation.class);
Field tField = tClass.getDeclaredField(myAnnotation.name());
tFiled.setAccessible(true);
f.set(aim, myAnnotation.type().cast(tField.get(object)));
})
return aim;
}
}