Java 反射,从方法中提取泛型
Java Reflection, extract generic type from method
我有一个具有以下签名的 java 方法:
static <ContentType> Map<Object,ContentType> foo();
我想根据ContentType
使用反射来动态改变方法的行为。
为此,我必须能够将 ContentType
作为一个对象来处理(也许是 java.lang.reflect.Type 的一个实例)。
有谁知道如何做到这一点?那个事件可能吗?
这不可能。 Java 中的泛型是 "syntactic sugar"。它们仅在编译时使用,但随后会被删除并且永远不会进入 class 文件。
This question 在这方面有一些非常好的信息。
在运行时检查可参数化类型本身,如 java.util.List,无法知道参数化为什么类型。但是,当您检查声明使用参数化类型的方法时,您可以在运行时看到可参数化类型被参数化为什么类型
Method method = MyClass.class.getMethod("getStringList", null);
Type returnType = method.getGenericReturnType();
if(returnType instanceof ParameterizedType){
ParameterizedType type = (ParameterizedType) returnType;
Type[] typeArguments = type.getActualTypeArguments();
for(Type typeArgument : typeArguments){
Class typeArgClass = (Class) typeArgument;
System.out.println("typeArgClass = " + typeArgClass);
}
}
我有一个具有以下签名的 java 方法:
static <ContentType> Map<Object,ContentType> foo();
我想根据ContentType
使用反射来动态改变方法的行为。
为此,我必须能够将 ContentType
作为一个对象来处理(也许是 java.lang.reflect.Type 的一个实例)。
有谁知道如何做到这一点?那个事件可能吗?
这不可能。 Java 中的泛型是 "syntactic sugar"。它们仅在编译时使用,但随后会被删除并且永远不会进入 class 文件。
This question 在这方面有一些非常好的信息。
在运行时检查可参数化类型本身,如 java.util.List,无法知道参数化为什么类型。但是,当您检查声明使用参数化类型的方法时,您可以在运行时看到可参数化类型被参数化为什么类型
Method method = MyClass.class.getMethod("getStringList", null);
Type returnType = method.getGenericReturnType();
if(returnType instanceof ParameterizedType){
ParameterizedType type = (ParameterizedType) returnType;
Type[] typeArguments = type.getActualTypeArguments();
for(Type typeArgument : typeArguments){
Class typeArgClass = (Class) typeArgument;
System.out.println("typeArgClass = " + typeArgClass);
}
}