如何在运行时处理注释?

时间:2014-12-27 05:18:28

标签: java annotations

我正在构建一个数据模型,我需要定义一个像@UNIQUE这样的注释,所以每当模型被填充时,它首先运行一个代码来检查数据库是否是唯一的。我的数据库不是关系型的并且不支持唯一索引,因此在数据库中执行它是不可能的。 我需要知道的是有一种方法可以编写注释逻辑来在运行时检查这个约束吗?

示例

public class model{
    @Unique
    public CustomKey key;
}

现在我想要在填充模型并看到此唯一注释时,它会自动首先调用下面的代码,然后继续: (以下是sudo代码而不是实际的java代码)

public void checkUnique(){
    if(annotation instanceof MyAnnotation){
        Unique myAnnotation = (Unique) annotation;
        checkifIsUnquie(myAnnotation.getVariableValue());
    }

1 个答案:

答案 0 :(得分:0)

关于反思

检查此项目:https://code.google.com/p/reflections/

将其包含在您的项目中,并使用下面的代码块获取注释注释的所有字段的列表:

Reflections reflections = new Reflections("my.project.prefix");

Set<Field> annotated = 
           reflections.getFieldsAnnotatedWith(SomeAnnotation.class);

另请注意,您需要声明注释类,即@Unique保留到运行时,否则javac将删除您注释的任何字段的注释信息。以下是您的工作方式:

@Retention(RUNTIME)
public @interface Unique { }

但实际上你需要AOP(面向方面​​编程)

因为在Java中,您不能仅使用注释来拦截代码流。在纯Java中,注释只是一个与类,字段等相关联的信息,您可以在编译时,运行时查询...而且您必须自己定义逻辑来处理它们。将AspectJ检查为Java AOP库/运行时,这可以让您做到你想要的。