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

标签 java annotations

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

SqlInfo.java

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

    CodificationInfo codificationInfo();
    DocumentInfo documentInfo();
}  

@CodificationInfo@DocumentInfo 也是注释接口(interface)。每个都有自己不同的值(value)观。

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注释。我通过使用以下方法从中获取值:

注解值获取方法

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 注释时如何获取 @CodificationInfo 值类(class)?这意味着 - 如何从子注释中获取值?

P.S.:我知道我可以在类中单独使用这两个注释。但我想知道如何从子注释中获取值。例如,hibernate 将其用于 @AuditOverrides 注释。

最佳答案

如果您的类型声明如下:

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

关于java - 如何从自定义子注释中获取值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50811290/

相关文章:

java - 给定 Class< 是否可以实例化 Java Annotation?扩展注解>?

java - 在 java 中将 double 分成两部分 "integer & fraction"的最佳方法是什么

java - lombok.config 上的 addLombokGeneratedAnnotation 不会忽略 Jacoco 报告上的 Lombok Annotations

java - 是否可以在 tomcat 中编辑类文件并重新编译该单个文件?

java - 确定来自 ServletContext 的资源是文件还是目录

java - @XmlJavaTypeAdapter 和包装器

scala - 您如何在用 Scala 编写的 JUnit 4 测试中实现 @BeforeClass 语义?

java - 全屏DialogFragment不适合屏幕

Android项目+Eclipse+注解处理

java - 通常可重用的注释或公共(public)注释?