/**
* Copyright 2011 Marcin Mikosik
* All rights reserved.
*/
package com.perunlabs.testinjector.util;
import static com.perunlabs.testinjector.util.Collections.newArrayList;
import static com.perunlabs.testinjector.util.Collections.newHashSet;
import static java.security.AccessController.doPrivileged;
import java.lang.annotation.Annotation;
import java.lang.reflect.AnnotatedElement;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.security.PrivilegedAction;
import java.util.List;
import java.util.Set;
public class Reflections {
public static Object getFieldValue(Object instance, Field field) {
boolean accessible = field.isAccessible();
setAccessible(field, true);
try {
return field.get(instance);
} catch (IllegalAccessException e) {
throw new AssertionError(e);
} finally {
setAccessible(field, accessible);
}
}
private static void setAccessible(final Field field, final boolean accessible) {
doPrivileged(new PrivilegedAction<Void>() {
@Override
public Void run() {
field.setAccessible(accessible);
return null;
}
});
}
private static boolean isStatic(Field field) {
return Modifier.isStatic(field.getModifiers());
}
public static Set<Field> annotatedFields(Class<?> klass, Class<? extends Annotation> annotation) {
Set<Field> fields = newHashSet();
for (Field field : nonStaticFields(klass)) {
if (field.isAnnotationPresent(annotation)) {
fields.add(field);
}
}
return fields;
}
public static List<Annotation> getElementAnnotations(AnnotatedElement element,
Class<? extends Annotation> klass) {
return filterAnnotationsAnnotatedWith(element.getAnnotations(), klass);
}
private static List<Annotation> filterAnnotationsAnnotatedWith(Annotation[] annotations,
Class<? extends Annotation> klass) {
List<Annotation> result = newArrayList();
for (Annotation annotation : annotations) {
if (annotation.annotationType().isAnnotationPresent(klass)) {
result.add(annotation);
}
}
return result;
}
private static List<Field> nonStaticFields(Class<?> klass) {
List<Field> result = newArrayList();
for (Field field : klass.getDeclaredFields()) {
if (!isStatic(field)) {
result.add(field);
}
}
return result;
}
}