Как получить значения из пользовательской поданнотации? - PullRequest
0 голосов
/ 12 июня 2018

У меня есть вопрос о получении значения пользовательской аннотации, которое является значением другой пользовательской аннотации.Например, у меня есть интерфейс аннотаций @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 аннотацию для класса.Я получаю значения из него с помощью этого метода:

Метод получения значений аннотаций

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 для класса?Это означает - как получить значения из поданнотации?

PS: я знаю, что могу использовать обе аннотации отдельно для класса.Но я хочу узнать, как получить значения из поданнотации.Например, в спящем режиме используйте его для аннотации @AuditOverrides.

1 Ответ

0 голосов
/ 12 июня 2018

Если у вас есть тип, объявленный как:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...