Использую кастомную аннотацию @Example("objectName")
, которая переносит нужную информацию - "objectName"
. Задался спортивным вопросом - как в аннотацию передать информацию? Попробовал использовать Generic для такого кейса:
public class GenericObject<T> {
@Example(T)
Object data;
}
Или например что-то вроде:
public class GenericObject<T> {
@Example(T.toString())
Object data;
}
Увы для Generic допустимо использовать только классы-обёртки типа Integer.
Вопрос в том, что какие есть способы создать класс с динамически генерируемой аннотацией?
Объявим аннотацию:
@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.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Столкнулся с проблемой: медленно выполняется программа, использующая CallableВернее так: ответ выдается сразу, но потом она очень долго думает...
Есть пример запроса через RestTemplate поведение которого конфигурируется через ClientHttpRequestFactory и RequestConfigПри создании объекта RequestConfig задаются три...
установил Oracle Database 11g + SQLDeveloperСоздал нового пользователя и connection
Пожалуйста, объясните по простому в чем отличие Thread, Handler, Runnable и AsyncTask?