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

Java 如何从自定义子注释中获取值?,java,annotations,Java,Annotations,我有一个关于获取自定义注释值的问题,该值是另一个自定义注释的值。例如,我有一个@SqlInfo注释接口,它有两个值,也是注释接口 SqlInfo.java @codicationinfo和@DocumentInfo也是注释接口。每个人都有自己不同的价值观 编目信息.java 而我只为类使用@codicationinfo注释。我使用以下方法从中获取值: 注释值getter方法 我想知道在使用类的@SqlInfo注释时如何获取@codicationinfo值?它的意思是-如何从子注释中获取值? 注:

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

SqlInfo.java

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

编目信息.java

而我只为类使用
@codicationinfo
注释。我使用以下方法从中获取值:

注释值getter方法

我想知道在使用类的
@SqlInfo
注释时如何获取
@codicationinfo
值?它的意思是-如何从子注释中获取值?


注:我知道我可以在课堂上分别使用这两种注释。但我想知道如何从子注释中获取值。例如,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();
final SqlInfo sqlInfoAnnotation=(SqlInfo)c.getAnnotation(SqlInfo.class);
if(sqlInfoAnnotation==null)返回;
最终编目信息codInfoAnnotation=sqlInfoAnnotation.codicationInfo();
最终类codClass=codInfoAnnotation.codicationClass();


注意:不使用原始类型可以避免强制转换注释(首选
Class
而不是
Class
)。

它正常工作。我没有注意到,这种方法几乎可以与从简单注释中获取值相同。谢谢。注意:如果您避免使用
原始类型
,则不需要强制转换。喜欢
Generic g超过
通用g我知道原始类型。但是如果您谈论的是
(SqlInfo)c.getAnnotation(SqlInfo.class)
casting,那么对于我来说,notcasted
Annotation
会抛出编译错误。但是正如我看到的
getAnnotation()
方法应该在方法内部强制转换对象。所以这真的很奇怪。@Dumbo这实际上是原始
类型的结果。通过使用通配符
编译错误将消失…谢谢,这些信息非常有用
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 = @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();