前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring入门到精通-ResolvableType有什么用呢

Spring入门到精通-ResolvableType有什么用呢

作者头像
小土豆Yuki
发布2023-09-02 15:49:00
1470
发布2023-09-02 15:49:00
举报
文章被收录于专栏:洁癖是一只狗洁癖是一只狗

前两天看项目代码,看到了Spring的一个类,虽然大概知道是干什么的,但是真的没有用过,如下如

代码语言:javascript
复制
 ResolvableType resolvableType = ResolvableType.forClass(Import.getClass());
 Class<?> fileBeanClass = resolvableType.getInterfaces()[0].getGeneric(0).resolve();

本着好奇的原则,简单研究了一下,感觉挺有用的,官方文档翻译如下

ResolvableType是对Java类型的封装,提供了对父类(getSuperType()),接口(getInterfaces()),泛型参数(getGeneric(int...))的访问,最底层的实现为resolve()方法.

ResolvableType可以使用forField(Field),forMethodParameter(Method,int),forMethodReturnType(Method)和forClass(Class)进行构造.这个类的大部分方法返回的都是ResolvableType类型,同时允许用户很容易地进行导航操作。

我们直接看一下实例,就很容易理解他的使用场景了,如下代码,比如如何获取File05使用的泛型呢?

接口

代码语言:javascript
复制
public interface FileInterface<T> {
    public String getFileId();
}
代码语言:javascript
复制
实现类
代码语言:javascript
复制
public class File05 implements FileInterface<Bean> {

    public String fileType;

    public List<Map<String,Integer>> listMap;

    @Override
    public String getFileId() {
        return "01";
    }

    public String getFileType() {
        return fileType;
    }

    public void setFileType(String fileType) {
        this.fileType = fileType;
    }
}
代码语言:javascript
复制
代码语言:javascript
复制
测试类
代码语言:javascript
复制
public class DemoApplication {

    public static void main(String[] args) throws NoSuchFieldException, NoSuchMethodException {
        ResolvableType resolvableType = ResolvableType.forClass(File05.class);
        ResolvableType[] interfaces = resolvableType.getInterfaces();
        System.out.println("获取File05类实现接口 "+interfaces[0]);
        System.out.println("获取File05类实现接口使用的泛型 "+interfaces[0].getGeneric(0).resolve());

        Class<?> rawClass = resolvableType.getRawClass();
        Method[] methods = rawClass.getMethods();
        System.out.println("获取File05类方法名字 "+methods[0].getName());
        System.out.println("获取File05类方法返回类型 "+methods[0].getReturnType());

        Field[] fields = rawClass.getFields();
        System.out.println("获取File05类属性的名字 "+fields[0].getName());

        ResolvableType field = ResolvableType.forField(File05.class.getDeclaredField("listMap"));
        System.out.println("获取File05类属性类型 "+field.getType());
        ResolvableType[] generics = field.getGenerics();
        System.out.println("获取File05类属性类型list中使用的泛型 "+ generics[0]);
        System.out.println("获取File05类属性类型list中使用泛型map中key的类型 "+generics[0].getGenerics()[0]);
        System.out.println("获取File05类属性类型list中使用泛型map中value的类型 "+generics[0].getGenerics()[1]);
    }

}

运行结果

代码语言:javascript
复制
获取File05类实现接口 com.example.demo.type.FileInterface<com.example.demo.type.Bean>
获取File05类实现接口使用的泛型 class com.example.demo.type.Bean
获取File05类方法名字 getFileId
获取File05类方法返回类型 class java.lang.String
获取File05类属性的名字 fileType
获取File05类属性类型 java.util.List<java.util.Map<java.lang.String, java.lang.Integer>>
获取File05类属性类型list中使用的泛型java.util.Map<java.lang.String, java.lang.Integer>
获取File05类属性类型list中使用泛型map中key的类型 java.lang.String
获取File05类属性类型list中使用泛型map中value的类型 java.lang.Integer

Spring在JDK的基础上,封装了一些我们常用的操作,让我们对java类以及java类型更加方便的操作.

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-06-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 洁癖是一只狗 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档