泛型反射

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

猜你喜欢

转载自zyz611.iteye.com/blog/2323536