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())));
}