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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容

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