Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 检查方法的返回是否为List<;字符串>;深思熟虑_Java_Reflection - Fatal编程技术网

Java 检查方法的返回是否为List<;字符串>;深思熟虑

Java 检查方法的返回是否为List<;字符串>;深思熟虑,java,reflection,Java,Reflection,我试图使用反射获取方法的返回类型,但是我似乎无法具体检查List。 我用了一种非常粗俗的方式: if(method.getGenericReturnType().getTypeName().equalsIgnoreCase(“java.util.List”)) 这不是我应该做的,所以我想知道是否有更好的解决方案。方法。getGenericReturnType()返回,正如您在javadocs中看到的,它有一个已知子类型的列表: All Known Subinterfaces: GenericA

我试图使用反射获取方法的返回类型,但是我似乎无法具体检查
List

我用了一种非常粗俗的方式:

if(method.getGenericReturnType().getTypeName().equalsIgnoreCase(“java.util.List”))

这不是我应该做的,所以我想知道是否有更好的解决方案。

方法。getGenericReturnType()
返回,正如您在javadocs中看到的,它有一个已知子类型的列表:

All Known Subinterfaces:
GenericArrayType, ParameterizedType, TypeVariable<D>, WildcardType
所有已知子接口:
GenericArrayType、ParameterizedType、TypeVariable、WildcardType
因此,您可以使用它执行几个实例的检查:

// 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;
//它是ParameterizedType吗?所以任何类型都像类型
if(!(method.getGenericReturnType()instanceof ParameterizedType))返回false;
ParameterizeType ParameterizedReturnType=(ParameterizeType)方法。getGenericReturnType();
//原始类型只是一个没有泛型部分的类
if(ParameterizedReturnType.getRawType()!=List.class)返回false;
if(ParameterizedReturnType.getActualTypeArguments().length!=1)返回false;
Type firstArg=ParameterizedReturnType.getActualTypeArguments()[0];
返回firstArg==String.class;

请注意,如果您只想读取一些数据,则类型可能更复杂,但仍然与列表兼容,比如方法可能具有签名,比如
ArrayList。您是否尝试调试
method.getGenericReturnType().getTypeName()
返回的内容?@KhairulIslam它返回的正是equals方法字符串中的内容,我只是想知道是否有更好的方法来检查它,而不需要像这样比较字符串。你不能迭代列表条目并使用instanceof?@GarrenFitzenreiter比较数据类型吗?那么你需要在每次使用方法时都这样做,并确保复制数据以不允许任何可变状态,因为有些东西可能会在以后将不同的类型添加到此列表中。当类型可用且OP不知道如何使用它时,这不是一个好的解决方案。由于类型检查只能在应用程序启动时进行一次,因为方法的类型在运行时不应更改。这正是我所寻找的,如果一个方法没有准确返回
列表
,我只想忽略它。我不知道
参数化类型
,所以我最好能想到字符串检查。非常感谢。
// 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;