Pat*_*son 12 java generics spring type-erasure
如您所知,Spring 4中有一个新功能:基于泛型类型的自动装配.它非常有用,但我想知道,Spring开发人员如何能够绕过类型擦除,这阻止了他们之前开发此类功能.
ysh*_*vit 10
擦除意味着信息从运行时消失.它仍然存在于编译时信息中,您可以通过反射访问它们.在粗略的层面上,您可以想到它会删除有关各个实例的一般信息,但不会删除有关类的一般信息.
例如,这是一个简单的程序,它定义了一个泛型方法foo,然后从中打印出有关它的通用信息main:
import java.util.*;
import java.lang.reflect.*;
public class GenericReflection {
public static void main(String[] args) throws Exception {
Method m = GenericReflection.class.getDeclaredMethod("foo");
System.out.println(m.getGenericReturnType());
}
public static List<String> foo() {
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
的java.util.List <java.lang.String中>
正如您所看到的,当您了解它时,它并不太复杂.
Method.getGenreicReturnType返回一个java.lang.reflect.Type,它有几个子类.一个是ParameterizedType,它有一个方法getActualTypeArguments返回这个类型参数化的实际类型.当然,这些类型也可能是通用的,这就是为什么它返回a Type[]而不是Class[].在foo上面的例子中,它返回一个包含一个元素的数组,表示String:
ParameterizedType pm = (ParameterizedType) m.getGenericReturnType();
Type[] pmArgs = pm.getActualTypeArguments();
System.out.println(Arrays.toString(pmArgs));
Run Code Online (Sandbox Code Playgroud)
[类java.lang.String]
有类似的"通用"方法Field.getGenericType.您可以使用这些信息来找出List<String>一个List参数来String,这正是他们所需要的信息.