package org.pinus4j.utils;
import java.io.Serializable;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ReflectUtil {
private static final Map<Class<?>, Field[]> fieldCache = new HashMap<Class<?>, Field[]>();
public static Object newObject(Class<?> clazz) throws InstantiationException, IllegalAccessException {
Object instance = null;
try {
instance = clazz.newInstance();
} catch (InstantiationException e) {
Constructor<?>[] constructors = clazz.getConstructors();
for (Constructor<?> c : constructors) {
Class<?>[] paramClasses = c.getParameterTypes();
Object[] paramObj = new Object[paramClasses.length];
for (int i = 0; i < paramClasses.length; i++) {
paramObj[i] = newObject(paramClasses[i]);
}
try {
instance = c.newInstance(paramObj);
} catch (Exception e1) {
}
if (instance != null) {
break;
}
}
}
if (instance == null) {
throw new InstantiationException();
}
return instance;
}
/**
* 获取一个对象的所有定义字段. 从父类开始算起,第一个被标志为壳序列化的类的字段及其子类的字段的可继承字段 当前类的所有字段.
*
* @param clazz 对象的class.
* @return 定义字段.
*/
public static Field[] getFields(Class<?> clazz) {
Field[] fields = fieldCache.get(clazz);
if (fields == null) {
// 获取所有的父类,判断从哪个父类开始有序列化能力.
List<Class<?>> c1 = new ArrayList<Class<?>>();
Class<?> curClass = clazz;
while (curClass != Object.class) {
c1.add(curClass);
curClass = curClass.getSuperclass();
}
int index = 0;
for (int i = c1.size() - 1; i >= 0; i--) {
Class<?> checkClass = c1.get(i);
for (Class<?> interf : checkClass.getInterfaces()) {
if (interf == Serializable.class) {
index = i;
break;
}
}
}
// 存放有序列化能力的对象
List<Class<?>> c2 = new ArrayList<Class<?>>();
c2.addAll(c1.subList(0, index + 1));
// 获取当前类的私有属性, 不要父类的私有属性
List<Field> fieldList = new ArrayList<Field>();
boolean curPrivate = true;
for (Class<?> c3 : c2) {
for (Field f : c3.getDeclaredFields()) {
if (Modifier.isFinal(f.getModifiers())) {
continue;
}
if (Modifier.isPrivate(f.getModifiers()) && !curPrivate) {
continue;
}
if (!fieldList.contains(f)) {
fieldList.add(f);
}
}
curPrivate = false;
}
// 放入缓存
fields = fieldList.toArray(new Field[fieldList.size()]);
// return fields;
fieldCache.put(clazz, fields);
}
return fields;
}
}