前两天看项目代码,看到了Spring的一个类,虽然大概知道是干什么的,但是真的没有用过,如下如
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使用的泛型呢?
接口
public interface FileInterface<T> {
public String getFileId();
}
实现类
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;
}
}
测试类
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]);
}
}
运行结果
获取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类型更加方便的操作.