Spring笔记-ResolvableType

前面2篇作为铺垫

  1. 对java-Type的理解
  2. java-Type的获取方式

之前讲过Class,Field,Method都有获取Type的需求,ResolvableType就是一个抽象的结果

1. 构建ResolvableType对象

ResolvableType提供了静态for方法进行构建,下面我们以代码来示例

1.1.forClass

    @SuppressWarnings("serial")
    static class ExtendsList extends ArrayList<CharSequence> {
    }

    @Test
    public void forClass() throws Exception {
        ResolvableType type = ResolvableType.forClass(ExtendsList.class);
        assertThat(type.getType(), equalTo((Type) ExtendsList.class));
    }

1.2.forField

    @Test
    public void forField() throws Exception {
        Field field = Fields.class.getField("charSequenceList");
        ResolvableType type = ResolvableType.forField(field);
        assertThat(type.getType(), equalTo(field.getGenericType()));
    }

1.3 forMethodParameter

forMethodParameter还有很多变种
1.3.1 forConstructorParameter
1.3.2 forMethodReturnType

    @Test
    public void forMethodParameter() throws Exception {
        Method method = Methods.class.getMethod("charSequenceParameter", List.class);
        MethodParameter methodParameter = MethodParameter.forMethodOrConstructor(method, 0);
        ResolvableType type = ResolvableType.forMethodParameter(methodParameter);
        assertThat(type.getType(), equalTo(method.getGenericParameterTypes()[0]));
    }

2.1 getType方法

获取自身类型

    @Test
    public void forClassTest() throws Exception {
        ResolvableType type = ResolvableType.forClass(ExtendsList.class);
        assertThat(type.getType(), equalTo((Type) ExtendsList.class));
        assertThat(type.getRawClass(), equalTo(ExtendsList.class));
    }

2.2 getSuperType方法

    @Test
    public void superTypeTest() throws Exception {
        ResolvableType type = ResolvableType.forType(ExtendsList.class);
        ResolvableType superType=type.getSuperType();
        System.out.println(superType.getType());
    }

输出结果:

java.util.ArrayList<java.lang.CharSequence>

2.3 getRawClass

当Type为ParameterizedType时有效

    @Test
    public void getRawClassTest() throws Exception {
        ResolvableType type = ResolvableType.forType(ExtendsList.class);
        ResolvableType superType=type.getSuperType();
        System.out.println(superType.getRawClass());
    }

输出结果:

java.util.ArrayList

2.4 as方法

上面的方式可以将ExtendsList以as的方式转换一下,向上取接口或父类

    @Test
    public void asTest() throws Exception {
        ResolvableType type = ResolvableType.forType(ExtendsList.class);
        ResolvableType listType=type.as(ArrayList.class);
        System.out.println(listType.getType());
        System.out.println(listType.getRawClass());
    }

输出结果:

java.util.ArrayList<java.lang.CharSequence>
class java.util.ArrayList

2.5 getGeneric方法

这时候看起来使用应该是比较简单了

    @Test
    public void getGenericTest() throws Exception {
        ResolvableType type = ResolvableType.forType(ExtendsList.class);
        ResolvableType listType=type.as(ArrayList.class);
        System.out.println(listType.getGeneric().getType());
    }

2.6 resolveGeneric方法

更加简化的一种方法

    @Test
    public void resolveGenericTest() throws Exception {
        ResolvableType type = ResolvableType.forType(ExtendsList.class);
        ResolvableType listType=type.as(ArrayList.class);
        System.out.println(listType.resolveGeneric());
    }

2.7 getComponentType方法

返回数组类型

    @Test
    public void getComponentTypeForClassArray() throws Exception {
        Field field = Fields.class.getField("arrayClassType");
        ResolvableType type = ResolvableType.forField(field);
        assertThat(type.isArray(), equalTo(true));
        assertThat(type.getComponentType().getType(),
                equalTo((Type) ((Class) field.getGenericType()).getComponentType()));
    }

    @Test
    public void getComponentTypeForGenericArrayType() throws Exception {
        ResolvableType type = ResolvableType.forField(Fields.class.getField("genericArrayType"));
        assertThat(type.isArray(), equalTo(true));
        assertThat(type.getComponentType().getType(),
                equalTo(((GenericArrayType) type.getType()).getGenericComponentType()));
    }

参考:
http://jinnianshilongnian.iteye.com/blog/1993608

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 137,099评论 19 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 180,185评论 25 708
  • 有句话这么说:帮你是情分,不帮你是本分。 一开始我觉得这句话说的有点不近人情,而且,中华民族不一向都认为助人为乐是...
    羊小彩阅读 602评论 8 0
  • 我是谁的谁,谁是我的谁 从一出生,我们就有了身份,是爸爸的儿子,妈妈的儿子,爷爷奶奶的孙子,外公外婆的外孙,以及七...
    蓝羽书生阅读 673评论 0 0
  • 生活中好像随处可见这样的人,有什么说什么,藏不住话。有时候我们会很欣赏这类人,因为他们真诚, 他们简单,没有很深的...
    leace1314阅读 411评论 2 2

友情链接更多精彩内容