我有一个基类Record,它代表数据库中的记录。我有可扩展记录的Customer和Job类。我以前从未使用过批注,但是我想做的是创建一个自定义批注并在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;
    }
}


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

最佳答案

我同意,通常,如果您使用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);

上面的方法现在可以获取recordType,它是带注释的已定义类

10-06 11:30