Change annotation parameters during runtime (#2006)
This commit is contained in:
parent
cdc9f8f9a1
commit
61135ac4da
|
@ -0,0 +1,23 @@
|
|||
package com.baeldung.java.reflection;
|
||||
|
||||
import java.lang.annotation.Annotation;
|
||||
|
||||
public class DynamicGreeter implements Greeter {
|
||||
|
||||
private String greet;
|
||||
|
||||
public DynamicGreeter(String greet) {
|
||||
this.greet = greet;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class<? extends Annotation> annotationType() {
|
||||
return DynamicGreeter.class;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String greet() {
|
||||
return greet;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,10 @@
|
|||
package com.baeldung.java.reflection;
|
||||
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
public @interface Greeter {
|
||||
|
||||
public String greet() default "";
|
||||
}
|
|
@ -0,0 +1,58 @@
|
|||
package com.baeldung.java.reflection;
|
||||
|
||||
import java.lang.annotation.Annotation;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.Map;
|
||||
|
||||
public class GreetingAnnotation {
|
||||
|
||||
private static final String ANNOTATION_METHOD = "annotationData";
|
||||
private static final String ANNOTATION_FIELDS = "declaredAnnotations";
|
||||
private static final String ANNOTATIONS = "annotations";
|
||||
|
||||
public static void main(String ...args) {
|
||||
Greeter greetings = Greetings.class.getAnnotation(Greeter.class);
|
||||
System.err.println("Hello there, " + greetings.greet() + " !!");
|
||||
|
||||
Greeter targetValue = new DynamicGreeter("Good evening");
|
||||
//alterAnnotationValueJDK8(Greetings.class, Greeter.class, targetValue);
|
||||
alterAnnotationValueJDK7(Greetings.class, Greeter.class, targetValue);
|
||||
|
||||
greetings = Greetings.class.getAnnotation(Greeter.class);
|
||||
System.err.println("Hello there, " + greetings.greet() + " !!");
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public static void alterAnnotationValueJDK8(Class<?> targetClass, Class<? extends Annotation> targetAnnotation, Annotation targetValue) {
|
||||
try {
|
||||
Method method = Class.class.getDeclaredMethod(ANNOTATION_METHOD, null);
|
||||
method.setAccessible(true);
|
||||
|
||||
Object annotationData = method.invoke(targetClass);
|
||||
|
||||
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(targetAnnotation, targetValue);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public static void alterAnnotationValueJDK7(Class<?> targetClass, Class<? extends Annotation> targetAnnotation, Annotation targetValue) {
|
||||
try {
|
||||
Field annotations = Class.class.getDeclaredField(ANNOTATIONS);
|
||||
annotations.setAccessible(true);
|
||||
|
||||
Map<Class<? extends Annotation>, Annotation> map = (Map<Class<? extends Annotation>, Annotation>) annotations.get(targetClass);
|
||||
System.out.println(map);
|
||||
map.put(targetAnnotation, targetValue);
|
||||
System.out.println(map);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
package com.baeldung.java.reflection;
|
||||
|
||||
@Greeter(greet="Good morning")
|
||||
public class Greetings {
|
||||
|
||||
}
|
Loading…
Reference in New Issue