[英]Java Reflection - Matching formal parameter list to actual parameter list
假设我有一个类Foo
public class Foo {
public void setParameter(String name, Object value) {
// ...
}
}
我想通过反射得到setParameter
方法。
问题是在我的代码中,当我需要获取此方法时,我只知道ACTUAL参数。 我已经构建了一个可以为我提供实际参数的Class
数组的方法。 不幸的是,返回的Class
从实际参数阵列([String.class, String.class])
不匹配 Class
形式参数的阵列([String.class, Object.class])
和getDeclaredMethod
产生异常NoSuchMethodException
。
您知道任何可以帮助匹配该方法的库或代码段吗?
您可能需要更聪明地找到要调用的方法。 一种选择是从getDeclaredMethods()
迭代每个方法,首先检查方法的名称,看看是否是你要调用的方法,然后检查实际参数的数量是否与形式参数的数量相匹配,最后,如果两者都是真的,迭代它的实际参数并检查参数类是否可以从你的形式参数类中分配。
然而,一个问题是如果你有方法会发生什么:
public void setParameter(String name, Object value);
public void setParameter(String name, String value);
因为两者都符合该测试。
我不知道我头顶的任何库可以轻量级地处理它。 虽然大多数依赖注入框架(Spring,Guice)会根据自己的需求获得一些支持,但是可能值得研究它们是如何做的。
Jon Skeet 在这里的答案有一个我正在解释的例子。
我只是使用getDeclaredMethods()
获取所有maethods,然后根据方法名称,参数计数以及最后Class.isAssignableFrom()
在代码中进行匹配,以检查参数的类型是否与签名匹配。 这留下了重载方法的签名在类型上不同的情况,这些类型可以与相同的具体类型(接口或超级/子类)兼容。 您必须决定您的代码是否必须支持此类极端情况。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.