package net.tooan.ynpay.commons;
import java.lang.reflect.Field;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
/**
* Created with IntelliJ IDEA.
* User: Jing
* Date: 13-10-15
* Time: 下午9:24
*/
public class ObjectFieldUtils {
private static ConcurrentHashMap<Class<?>, Field[]> FIELD_CACHE_MAP = new ConcurrentHashMap<Class<?>, Field[]>();
public static Field[] getAllField(Object object) {
return getAllField(object.getClass());
}
public static Field[] getAllField(Class<?> clazz) {
Field[] fields = FIELD_CACHE_MAP.get(clazz);
if (fields == null) {
synchronized (FIELD_CACHE_MAP) {
if ((fields = FIELD_CACHE_MAP.get(clazz)) == null) {
Set<Field> fieldSet = new HashSet<Field>();
allField(clazz, fieldSet);
fields = fieldSet.toArray(new Field[fieldSet.size()]);
FIELD_CACHE_MAP.put(clazz, fields);
}
}
}
return fields;
}
private static void allField(Class<?> clazz, Set<Field> fields) {
if (clazz == null) {
return;
}
for (Field field : clazz.getDeclaredFields()) {
fields.add(field);
}
allField(clazz.getSuperclass(), fields);
}
public static void fieldSetAccessible(final Field field) {
if (!field.isAccessible()) {
if (System.getSecurityManager() != null) {
AccessController.doPrivileged(new PrivilegedAction<Object>() {
public Object run() {
field.setAccessible(true);
return null;
}
});
} else {
field.setAccessible(true);
}
}
}
}