繁体   English   中英

如何获取字段的泛型参数类

[英]how to get classes of generics parameters for fields

我正在使用反射库[1]获取字段。 对于声明为public Map<Integer, Boolean> nameF; 我想获取其字符串表示形式:“地图名称F”。 虽然“ Map”和“ nameF”很容易获得,但我无法获取“ Integer”和“ Boolean”类型。

[1] https://github.com/ronmamo/reflections

package main;

import org.reflections.Reflections;
import org.reflections.scanners.FieldAnnotationsScanner;
import org.reflections.scanners.SubTypesScanner;
import org.reflections.scanners.TypeAnnotationsScanner;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.AnnotatedType;
import java.lang.reflect.Field;
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
import java.util.Map;
import java.util.Set;

public class Test {

    @Target({ElementType.FIELD})
    @Retention(RetentionPolicy.CLASS)
    public @interface MyAnnotation {
    }

    public class TestClass {

        @MyAnnotation
        public Map<Integer, Boolean> fieldFoo;

    }

    public static void main(String[] args) {
        Reflections reflections = new Reflections(Test.class.getCanonicalName(),
                new SubTypesScanner(false),
                new TypeAnnotationsScanner(),
                new FieldAnnotationsScanner());
        {
            Set<Field> annotated = reflections.getFieldsAnnotatedWith(MyAnnotation.class);
            for (Field controller : annotated) {
                System.out.println("#1:" + controller.getDeclaringClass().getCanonicalName() + " " + controller.getName() + " " + controller.getType().getCanonicalName() + " ");
                for (TypeVariable<? extends Class<?>> elem : controller.getType().getTypeParameters()) {
                    System.out.println("#2:" + elem);
                    for (Type bound : elem.getBounds()) {
                        System.out.println("#3:" + bound);
                        System.out.println("#4:" + bound.getTypeName());
                    }
                    for (AnnotatedType bound : elem.getAnnotatedBounds()) {
                        System.out.println("#5:" + bound);
                        System.out.println("#6:" + bound.getType());
                    }
                }
                System.out.println("#7:" + controller.getClass().getGenericSuperclass());

            }

        }


    }
}

上面的代码导致以下结果

#1:main.Test.TestClass fieldFoo java.util.Map 
#2:K
#3:class java.lang.Object
#4:java.lang.Object
#5:sun.reflect.annotation.AnnotatedTypeFactory$AnnotatedTypeBaseImpl@ba4d54
#6:class java.lang.Object
#2:V
#3:class java.lang.Object
#4:java.lang.Object
#5:sun.reflect.annotation.AnnotatedTypeFactory$AnnotatedTypeBaseImpl@12bc6874
#6:class java.lang.Object
#7:class java.lang.reflect.AccessibleObject

使用Field.getGenericType()然后将TypeParameterizedType ,然后为您的示例调用ParameterizedType.getActualTypeArguments() ,这将返回2的数组。 IntegerBoolean 根据您的代码的示例:

public static void main(String[] args) {
    Reflections reflections = new Reflections(Test.class.getCanonicalName(),
            new SubTypesScanner(false),
            new TypeAnnotationsScanner(),
            new FieldAnnotationsScanner());
    {
        Set<Field> annotated = reflections.getFieldsAnnotatedWith(MyAnnotation.class);
        for (Field controller : annotated) {
            Type genericType = controller.getGenericType();
            if(genericType instanceof ParameterizedType){
                for(Type genericTypeArg: ((ParameterizedType)genericType).getActualTypeArguments()) {
                    System.out.println("Generic Type Arg: "+genericTypeArg.getTypeName());
                }
            } else {
                System.out.println("Can't determine generic type");
            }
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM