package genericType; import java.lang.reflect.Field; import java.lang.reflect.GenericArrayType; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.Arrays; public class GenericArrayTypeExample { public static void main(String[] args) throws NoSuchFieldException, SecurityException { printFieldType(ArrayBean.class, "arrayType"); System.out.println("\n"); printFieldType(ArrayBean.class, "genericArrayType"); System.out.println("\n"); printFieldType(ArrayBean.class, "genericMultiArrayType"); System.out.println("\n"); printFieldType(ArrayBean.class, "specialMultiArrayType"); } private static void printFieldType(Class<?> clazz, String fieldName) throws NoSuchFieldException, SecurityException { System.out.println("Type details of field " + fieldName); Field field = clazz.getField(fieldName); System.out.println("Declared class: " + field.getDeclaringClass()); Type genericType = field.getGenericType(); System.out.println("Generic type: " + genericType.getTypeName()); Type type = field.getType(); System.out.println("Type: " + type.getTypeName()); if (isGenericArrayType(genericType)) { printGenericFieldType((GenericArrayType) genericType); } if (isParameterizedType(genericType)) { printParameterizedType((ParameterizedType) genericType); } } private static void printGenericFieldType(GenericArrayType genericArrayType) { Type componentType = genericArrayType.getGenericComponentType(); System.out.println("Component type of : " + genericArrayType.getTypeName() + " is " + componentType.getTypeName()); if (isGenericArrayType(componentType)) { printGenericFieldType((GenericArrayType) componentType); } if (isParameterizedType(componentType)) { printParameterizedType((ParameterizedType) componentType); } } private static boolean isGenericArrayType(Type type) { if (GenericArrayType.class.isAssignableFrom(type.getClass())) { System.out.println("Is GenericArrayType ? true"); return true; } return false; } private static boolean isParameterizedType(Type type) { return ParameterizedType.class.isAssignableFrom(type.getClass()); } private static void printParameterizedType(ParameterizedType parmType) { System.out.println("Parameterized type details of " + parmType); System.out.println("Type name " + parmType.getTypeName()); System.out.println("Raw type: " + parmType.getRawType()); System.out.println("Actual type arguments: " + Arrays.asList(parmType.getActualTypeArguments())); for (Type type : parmType.getActualTypeArguments()) { if (isParameterizedType(type)) { printParameterizedType((ParameterizedType) type); } } } }
package genericType; import genericType.demo.SomeBean; import java.util.List; public class ArrayBean { public List[] arrayType; public List<String>[] genericArrayType; public List<String>[][] genericMultiArrayType; public List<SomeBean<String, Integer>>[][] specialMultiArrayType; }