我有一个基类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,它是带注释的已定义类