diff --git a/Zutil.iml b/Zutil.iml old mode 100644 new mode 100755 index 28d731d..1fb7c70 --- a/Zutil.iml +++ b/Zutil.iml @@ -32,5 +32,15 @@ + + + + + + + + + + \ No newline at end of file diff --git a/src/zutil/ClassUtil.java b/src/zutil/ClassUtil.java old mode 100644 new mode 100755 index 0ad2cd8..16af2af --- a/src/zutil/ClassUtil.java +++ b/src/zutil/ClassUtil.java @@ -27,8 +27,11 @@ package zutil; import java.lang.reflect.Field; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; +import java.lang.reflect.TypeVariable; +import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; +import java.util.Objects; /** * This class include some utility functions for classes @@ -83,15 +86,42 @@ public class ClassUtil { } + /** + * @param field is the field to return the generics from + * @return the generics assigned to a specific field or a empty list + */ public static Class[] getGenericClasses(Field field){ - Class[] classArray = new Class[0]; - Type genericFieldType = field.getGenericType(); + return getGenericClasses(field.getGenericType()); + } + /** + * Traverses the class hierarchy and searches for the given super class or interface + * and returns the assigned generic types. + * + * @param c the source class + * @param superClass is the super class to search for + * @return the generics for a specific super class or a empty list if + * there is no generics or the super class is not found + */ + public static Class[] getGenericClasses(Class c, Class superClass){ + // Search for the super class + while (c.getSuperclass() != Object.class && !superClass.isAssignableFrom(c.getSuperclass())) + c = c.getSuperclass(); + // Did we find the super class? + if (superClass.isAssignableFrom(c.getSuperclass())) + return getGenericClasses(c.getGenericSuperclass()); - if(genericFieldType instanceof ParameterizedType){ - ParameterizedType aType = (ParameterizedType) genericFieldType; - Type[] fieldArgTypes = aType.getActualTypeArguments(); - classArray = Arrays.copyOf(fieldArgTypes, fieldArgTypes.length, Class[].class); + return new Class[0]; + } + private static Class[] getGenericClasses(Type genericType){ + if(genericType instanceof ParameterizedType){ + ParameterizedType aType = (ParameterizedType) genericType; + Type[] argTypes = aType.getActualTypeArguments(); + Class[] classArray = new Class[argTypes.length]; + for(int i=0; i) argTypes[i]; + } + return classArray; } - return classArray; + return new Class[0]; } } diff --git a/src/zutil/parser/json/JSONObjectInputStream.java b/src/zutil/parser/json/JSONObjectInputStream.java index 2070c9e..1d6271c 100755 --- a/src/zutil/parser/json/JSONObjectInputStream.java +++ b/src/zutil/parser/json/JSONObjectInputStream.java @@ -129,8 +129,8 @@ public class JSONObjectInputStream extends InputStream implements ObjectInput, C @SuppressWarnings({ "rawtypes", "unchecked" }) - protected Object readType(Class type, Class[] genType, String key, DataNode json) throws IllegalAccessException, ClassNotFoundException, InstantiationException, UnsupportedDataTypeException, NoSuchFieldException { - if(json == null) + protected Object readType(Class type, String key, DataNode json) throws IllegalAccessException, ClassNotFoundException, InstantiationException, UnsupportedDataTypeException, NoSuchFieldException { + if(json == null || type == null) return null; // Field type is a primitive? if(type.isPrimitive() || String.class.isAssignableFrom(type)){ @@ -142,25 +142,27 @@ public class JSONObjectInputStream extends InputStream implements ObjectInput, C else{ Object array = Array.newInstance(type.getComponentType(), json.size()); for(int i=0; i[] genType = ClassUtil.getGenericClasses(type, List.class); List list = (List)type.newInstance(); for(int i=0; i=1? genType[0] : null), key, json.get(i))); } return list; } else if(Map.class.isAssignableFrom(type)){ + Class[] genType = ClassUtil.getGenericClasses(type, Map.class); Map map = (Map)type.newInstance(); for(Iterator it=json.keyIterator(); it.hasNext();){ String subKey = it.next(); map.put( subKey, - readType(genType[1], null, subKey, json.get(subKey))); + readType((genType.length>=2? genType[1] : null), subKey, json.get(subKey))); } return map; } @@ -210,7 +212,6 @@ public class JSONObjectInputStream extends InputStream implements ObjectInput, C field.setAccessible(true); field.set(obj, readType( field.getType(), - ClassUtil.getGenericClasses(field), field.getName(), json.get(field.getName()))); }