我有一个基类Record,它代表数据库中的记录。我有Customer和Job类来扩展记录。我以前从未使用过注释,但我想我想做的是创建一个自定义注释并在我的Customer类中标记一个返回其Jobs对象的方法,所以我知道在我保存客户时将Jobs对象保存到数据库。
像这样的东西
class Record{
private int id;
public void save(){
//look up all methods in the current object that are marked as @alsoSaveList,
//call those methods, and save them as well.
//look up all methods in the current object that are marked as @alsoSaveRecord,
//call those methods, and save the returned Record.
}
}
class Customer extends Record{
@alsoSaveList
public List<Job> jobs(){
return list of all of customers jobs objects;
}
}
class Job extends Record{
@alsoSaveRecord
public Customer customer(){
return its customer object;
}
}
这可能吗?有人能指出我正确的方向吗?
答案 0 :(得分:2)
我同意,通常如果您使用ORM,那么您可以让JPA或Hibernate处理此问题。但是,如果您想要一个程序化的响应,就像您在这里提到的一个简单的示例:
定义注释: AlsoSaveRecord.class
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface AlsoSaveRecord {
// The record class type
Class<?> value();
}
查找要调用的方法的代码:您可以添加到上面的类示例中的代码
public void save() {
List<Method> toSaveRecords = findMethodsAnnotatedWith(AlsoSaveRecord.class, obj);
for (Method rec : toSaveRecords) {
AlsoSaveRecord anno = rec.getAnnotation(AlsoSaveRecord.class);
Class<?> recordType = anno.value();
Object objToSave = rec.invoke(obj);
}
}
List<Method> findMethodsAnnotatedWith(Class<? extends Annotation> annotation, Object instance)
{
Method[] methods = instance.getClass().getDeclaredMethods();
List<Method> result = new ArrayList<Method>();
for (Method m : methods) {
if (m.isAnnotationPresent(annotation)) {
result.add(m);
}
}
return result;
}
以上内容将扫描Object中的AlsoSaveRecord注释并返回任何适用的方法。然后,您可以调用返回的那些由于注释而导致的方法。调用将返回您可以强制转换的对象或使用。
按要求编辑以在注释中定义“记录类型”(即@AlsoSaveRecord(MyRecord.class);
上面的方法现在可以获取recordType,它是带注释时定义的类