我试图让使用反射的方法的返回类型,但是我似乎不能够检查List<String>
明确。
我做了一个非常哈克方式:
if (method.getGenericReturnType().getTypeName().equalsIgnoreCase("java.util.List<java.lang.String>"))
这是不是真的是我应该做的,所以我想知道是否有更好的解决方案。
method.getGenericReturnType()
返回java.lang.reflect.Type正如你可以看到的Javadoc它具有已知亚型的列表:
All Known Subinterfaces:
GenericArrayType, ParameterizedType, TypeVariable<D>, WildcardType
所以,你可以用它来进行一些instanceof检查:
// is it ParameterizedType - so any type like Type<GenericType, OrMoreTypes>
if (!(method.getGenericReturnType() instanceof ParameterizedType)) return false;
ParameterizedType parametrizedReturnType = (ParameterizedType) method.getGenericReturnType();
// raw type is just a class without generic part
if (parametrizedReturnType.getRawType() != List.class) return false;
if (parametrizedReturnType.getActualTypeArguments().length != 1) return false;
Type firstArg = parametrizedReturnType.getActualTypeArguments()[0];
return firstArg == String.class;
注意该类型可能会更加复杂,但仍然与兼容列表,如果你只是想读一些数据,如方法可能有这样的签名ArrayList<? extends String>
,然后检查将返回false。如果你想也支持这样的情况下最好使用一些库,例如org.apache.commons.lang3.reflect.TypeUtils.isAssignable因为这样的库允许您创建类型定义的实例(这些图书馆只是有这些接口的自己的实现)和执行更高级的检查等isAssignable
或isInstance
作为可悲Java不提供这样的API。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句