java - 如何检查方法是否在 Java 中返回 Collection<Foo>?

标签 java reflection

我想根据方法的签名检查接口(interface)中是否存在方法。

该方法应具有的签名是:

Collection<Foo> methodName(Spam arg0, Eggs arg1, ...)

我可以通过 Class.getMethods() 找到方法 然后用method.getName()分别找到名称、参数和返回类型, method.getParameterTypes()method.getReturnType() .

但是我要将返回类型与什么进行比较以确保只有返回 Collection<Foo> 的方法被选中,而不是其他集合?

method.getReturnType().equals(Collection.class) 

因为以上内容适用于所有返回集合的方法,而不仅仅是那些返回 Foo 的方法。 Collection 。

最佳答案

有一个名为 public Type getGenericReturnType() 的方法它可以返回(如果是这样的话)一个 ParameterizedType .

A ParameterizedType 可以为您提供有关通用类型的更多信息,例如 Collection<Foo> .

特别是 getActualTypeArguments()方法,您可以获得每个参数的实际类型。

在这里,ParameterizedType代表 Collection 和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);
    }
}

来源: http://tutorials.jenkov.com/

关于java - 如何检查方法是否在 Java 中返回 Collection<Foo>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3531976/

相关文章:

java - 使用Java将数组替换并添加到两个数组中

java - 如何使用 Guava MapInterfaceTest 来测试您的类

scala - 在 Scala 2.10 中获取 java.lang.Class[T] 的 Scala 类型

objective-c - 如何获取定义该方法的类,而不是调用该方法的实例?

go - 反射(reflect) slice 底层类型

java - 如何更改 Netbeans 中自动生成的代码模板?

java - 像id这样的动态数据类型?

java - JAXB 绑定(bind)文件中的 XPath 评估导致目标节点为空

c# - GetType().GetMethods 在使用 BindingFlag 时不返回任何方法

java - 使用反射设置属性的属性