如何从自定义子注释中获取值?

时间:2018-06-12 07:14:23

标签: java annotations

我有一个关于获取自定义注释值的问题,该值是另一个自定义注释的值。例如,我有一个 @SqlInfo 注释接口,它有两个值,也是注释接口。

SqlInfo.java

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface SqlInfo {

    CodificationInfo codificationInfo();
    DocumentInfo documentInfo();
}  

@CodificationInfo @DocumentInfo 也是注释界面。每个都有自己不同的价值观。

CodificationInfo.java

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface CodificationInfo {

    enum KEYS {
        DOMAIN,
        FILE,
        TABLE,
        CLASS
    }

    String domain() default "";
    String fileName() default "";
    String table() default "";
    Class codificationClass();
}

虽然我只为课程使用 @CodificationInfo 注释。我使用这种方法从中获取值:

注释值getter方法

public Object getClassAnnotationValue(Class c, String key) {
    Annotation annotation = c.getAnnotation(CodificationInfo.class);
    return getObjectByKey(annotation, key);
}

private Object getObjectByKey(Annotation annotation, String key) {
    if (annotation instanceof CodificationInfo) {
        if (key.equalsIgnoreCase(CodificationInfo.KEYS.TABLE.toString())) {
            return ((CodificationInfo) annotation).table();
        } else if (key.equalsIgnoreCase(CodificationInfo.KEYS.CLASS.toString())) {
            return ((CodificationInfo) annotation).codificationClass();
        } else if (key.equalsIgnoreCase(CodificationInfo.KEYS.DOMAIN.toString())) {
            return ((CodificationInfo) annotation).domain();
        } else if (key.equalsIgnoreCase(CodificationInfo.KEYS.FILE.toString())) {
            return ((CodificationInfo) annotation).fileName();
        }
    }
    return null;
}  

我想知道如何在课程中使用 @CodificationInfo 注释时获取 @SqlInfo 值?这意味着 - 如何从子注释中获取值?

P.S。:我知道我可以在课堂上分别使用两个注释。但我想知道如何从子注释中获取值。例如,hibernate将其用于@AuditOverrides注释。

1 个答案:

答案 0 :(得分:1)

如果您的类型声明为:

@SqlInfo(codificationInfo = @CodificationInfo(codificationClass = AClass.class)
public class MyType { }

您可以反射性地获取内部注释值:

final SqlInfo sqlInfoAnnotation = (SqlInfo) c.getAnnotation(SqlInfo.class);    
if (sqlInfoAnnotation == null) return;

final CodificationInfo codInfoAnnotation = sqlInfoAnnotation.codificationInfo();

final Class<?> codClass = codInfoAnnotation.codificationClass();

注意:您可以避免因不使用原始类型而转换注释(更喜欢Class<?>而不是Class)。