提取一般类型我有一个Java方法具有以下签名:Java反射,从方法
static <ContentType> Map<Object,ContentType> foo();
我想使用反射来根据ContentType
动态改变方法的行为。 为了实现这个目标,我必须能够将ContentType
作为一个对象(可能是java.lang.reflect.Type的一个实例)来处理。 有谁知道如何做到这一点?这个事件可能吗?
提取一般类型我有一个Java方法具有以下签名:Java反射,从方法
static <ContentType> Map<Object,ContentType> foo();
我想使用反射来根据ContentType
动态改变方法的行为。 为了实现这个目标,我必须能够将ContentType
作为一个对象(可能是java.lang.reflect.Type的一个实例)来处理。 有谁知道如何做到这一点?这个事件可能吗?
这是不可能的。 Java中的泛型是“语法糖”。它们只在编译时使用,但随后被删除,并且永远不会将其放入类文件中。
This question有一些真的很好的信息。
注意:Java 9可能会有这个功能。 –
@Arnaud:这很酷......你能分享一个链接吗? –
@ArnaudDenoyelle你为什么说它可能在Java 9中?如果您正在讨论作为[价值类型提案](http://openjdk.java.net/jeps/169)的一部分的通用更改,它目前针对Java 10(并且距离完成还有很远的距离,所以这可能不会结束)。 – Toby
在运行时检查一个可参数化类型本身,比如java.util.List,无法知道参数化类型是什么类型。但是,当你检查声明使用参数化类型的方法,你可以在运行时看到什么类型的参数化类型,是因为类型擦除Java的前9参数化以
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);
}
}
将是不可能的。 –
要做到这一点的唯一方法是添加一个参数:static Map
或当然,测试地图的内容。 –