我希望检查接口中是否存在基于其签名的方法。
该方法应具有的签名是:
Collection<Foo> methodName(Spam arg0, Eggs arg1, ...)
我可以通过Class.getMethods()
找到方法
然后分别使用method.getName()
,method.getParameterTypes()
和method.getReturnType()
查找名称,参数和返回类型。
但是我要比较返回类型以确保只选择返回Collection<Foo>
的方法,而不是其他集合?
method.getReturnType().equals(Collection.class)
由于以上所有返回集合的方法都是如此,而不仅仅是那些返回Foo
集合的方法。
答案 0 :(得分:8)
有一个名为public Type getGenericReturnType()
的方法可以返回{如果是这种情况)a ParameterizedType
。
ParameterizedType
可以为您提供有关通用类型的更多信息,例如Collection<Foo>
。
特别是使用getActualTypeArguments()
方法,您可以获得每个参数的实际类型。
此处,ParameterizedType
表示集合,getActualTypeArguments()
表示包含Foo
您可以尝试此操作列出通用类型的参数:
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);
}
}
答案 1 :(得分:2)
答案 2 :(得分:0)
通用类型参数在Java中不会保留(即它只是一个编译时功能),所以你不能这样做。