代码之家  ›  专栏  ›  技术社区  ›  Dumbo Faisal

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

  •  0
  • Dumbo Faisal  · 技术社区  · 6 年前

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

    小精灵

    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.TYPE)
    public @interface SqlInfo {
    
        CodificationInfo codificationInfo();
        DocumentInfo documentInfo();
    }  
    

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

    编码信息.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();
    }
    

    当我只使用 @编码信息 类的批注。我使用以下方法从中获取值:

    注释值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;
    }  
    

    我想知道如何 @编码信息 使用时的值 @ SqlInfo 课堂注释?它意味着—— 如何从子批注中获取值?

    附注:我知道我可以分别使用这两个注释。但我想知道如何从子注释中获取值。例如hibernate使用它 @AuditOverrides 注释。

    1 回复  |  直到 6 年前
        1
  •  1
  •   payloc91    6 年前

    如果类型声明为:

    @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 )