繁体   English   中英

Java反射 - 将形式参数列表与实际参数列表匹配

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM