Как передать информацию в аннотацию?

210
24 июня 2018, 03:10

Использую кастомную аннотацию @Example("objectName"), которая переносит нужную информацию - "objectName". Задался спортивным вопросом - как в аннотацию передать информацию? Попробовал использовать Generic для такого кейса:

    public class GenericObject<T> {
    @Example(T) 
    Object data;
    }

Или например что-то вроде:

    public class GenericObject<T> {
    @Example(T.toString()) 
    Object data;
    }

Увы для Generic допустимо использовать только классы-обёртки типа Integer.

Вопрос в том, что какие есть способы создать класс с динамически генерируемой аннотацией?

Answer 1

Объявим аннотацию:

@Retention (RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    String name() default "";
}

Реализуем в классе:

public static class DynamicAnnotation implements MyAnnotation {
    private String name;
    public DynamicAnnotation(String name) {
        this.name = name;
    }
    @Override
    public String name() {
        return name;
    }
    @Override
    public Class<? extends Annotation> annotationType() {
        return DynamicAnnotation.class;
    }
}
@MyAnnotation(name = "Dragon Warrior")
public static class Demo {
}

Метод по замене:

private static final String ANNOTATIONS = "annotations";
public static final String ANNOTATION_DATA = "annotationData";
public static void alterAnnotationOn(Class clazzToLookFor, Class<? extends Annotation> annotationToAlter, Annotation annotationValue) {
    try {
        Method method = Class.class.getDeclaredMethod(ANNOTATION_DATA, null);
        method.setAccessible(true);
        Object annotationData = method.invoke(clazzToLookFor);
        Field annotations = annotationData.getClass().getDeclaredField(ANNOTATIONS);
        annotations.setAccessible(true);
        Map<Class<? extends Annotation>, Annotation> map = (Map<Class<? extends Annotation>, Annotation>) annotations.get(annotationData);
        map.put(annotationToAlter, annotationValue);
    }
    catch (Exception e) {
        e.printStackTrace();
    }
}

Проверяем:

MyAnnotation greet = Demo.class.getAnnotation(MyAnnotation.class);
System.err.println("Hello there [" + greet.name() + "]");
DynamicAnnotation altered = new DynamicAnnotation("KungFu Panda");
alterAnnotationOn(Demo.class, MyAnnotation.class, altered);
greet = Demo.class.getAnnotation(MyAnnotation.class);
System.err.println("After alteration...Hello there [" + greet.name() + "]");

Выведет:

Hello there [Dragon Warrior]
After alteration...Hello there [KungFu Panda]

Пример отсюда. Я скопировал только пример для Java 8. Там есть и для Java 7.

READ ALSO
Медленно работает Callable

Медленно работает Callable

Столкнулся с проблемой: медленно выполняется программа, использующая CallableВернее так: ответ выдается сразу, но потом она очень долго думает...

223
Чем отличаются ConnectTimeout и ConnectionRequestTimeout?

Чем отличаются ConnectTimeout и ConnectionRequestTimeout?

Есть пример запроса через RestTemplate поведение которого конфигурируется через ClientHttpRequestFactory и RequestConfigПри создании объекта RequestConfig задаются три...

230
подключение oracle database к приложению javaFX

подключение oracle database к приложению javaFX

установил Oracle Database 11g + SQLDeveloperСоздал нового пользователя и connection

199
Объясните на пальцах, в чем отличие Thread, Handler, Runnable и AsyncTask?

Объясните на пальцах, в чем отличие Thread, Handler, Runnable и AsyncTask?

Пожалуйста, объясните по простому в чем отличие Thread, Handler, Runnable и AsyncTask?

217