我有一个关于获取自定义注释值的问题,该值是另一个自定义注释的值。例如,我有一个 @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
注释。
答案 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
)。