0

我有一个基类 Record,它代表数据库中的记录。我有扩展记录的客户和工作类。我以前从未使用过注释,但我想我想做的是创建一个自定义注释并在我的 Customer 类中标记一个返回其 Jobs 对象的方法,这样我就知道在保存 Customer 时将 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;
    }
}

这可能吗?有人能指出我正确的方向吗?

4

1 回答 1

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;
}

以上将扫描手头对象中的 AlsoSaveRecord 注释并返回任何适用的方法。然后,您可以调用那些作为注释结果返回的方法。调用将返回您可以强制转换或执行某些操作的对象。

根据要求编辑以在注释中定义“记录类型”(即。@AlsoSaveRecord(MyRecord.class);

上面的方法现在可以获取注释时定义的类的记录类型

于 2013-04-22T07:35:30.733 回答