我正在编写一个任务执行框架,结构如下:
@XmlRoot("")
class PayloadPojo {
String cron;
String name;
int id;
String user;
}
@Task(payload = PayloadPojo.class)
class MyTask {
String cron;
String user;
int id;
...
// other fields;
// Task execution logic
}
@CallBack(task = MyTask.class)
class MyCallBack {...}
我试图在此处编写一个简单的框架,用户可以定义自己的有效载荷POJO来绑定来自远程事件的数据,并使用提供的注释定义要在该数据上运行的任务。假设调用回调时,传入了String
有效负载,我可以反射地将回调的目标任务类作为任务的有效负载POJO。
问题是,如何通过比较字段名并复制相同的字段名来实例化MyTask
实例中的PayloadPojo
。我的逻辑如下:
// In MyCallBack class
public MyTask getTask(String payloadStr) {
Class callbackCls = AopUtils.getTargetClass(this);
if (clazz.isAnnotationPresent(CallBack.class)) {
// Get task param, which is MyTask.class, and then get its payload: PayloadPojo.class
// Deserialize to PayloadPojo instance
Class taskCls = callbackCls .getAnnotation(CallBack.class).task();
Class payloadCls = taskCls.getAnnotation(Task.class).payload();
Object payload = payloadCls.cast(ummarshaller.ummarshall(payloadStr));
// Here is my question:
// Need to create instance of taskCls from payload object
// Note the payload is of type Object
return myTaskInstance;
}
return null;
}
这里的逻辑是POJO类和Task类应该具有一些相同的字段(因为任务执行依赖于回调中的数据)。但是要获得更好的模块化,仍然需要专用的POJO类。