【问题标题】:Access overloaded method via Reflection Api通过 Reflection Api 访问重载方法
【发布时间】:2020-01-10 20:44:29
【问题描述】:

如何使用反射来区分类重载方法,例如:

method()method(int arg)

void invoke(Object object, String methodName, int id) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
        object.getClass().getDeclaredMethod(methodName).invoke(object, int.class);
}

并调用此函数:

getV(new Object(), "method", 33);

它返回错误java.lang.IllegalArgumentException: wrong number of arguments,这意味着默认选择没有参数的方法。如果我在没有 int 参数的情况下调用该方法,它将起作用。请问如何区分重载方法的?我已经阅读了Class.getDeclaredMethodhttps://docs.oracle.com/javase/8/docs/api/java/lang/Class.html 的文档还有关于 SO 的旧帖子,但两个来源都没有回答同一个问题 How to find an overloaded method in Java?。当然 Class.Object 没有带有名称方法的方法,我只是将它用于示例。

【问题讨论】:

  • @Holger 你没看到 int.class 那里吗?我选择带有 1 个参数的方法。
  • @Holger 我明白了:)谢谢!

标签: java reflection


【解决方案1】:

您必须为查找方法指定参数类型,而不是调用方法:

void invoke(Object object, String methodName, int id) throws ReflectiveOperationException {
    object.getClass().getDeclaredMethod(methodName, int.class).invoke(object, id);
}

但请记住,getClass() 返回实际类,它可能是预期类的子类,而 getDeclaredMethod 不查找超类。 getMethod 确实搜索超类,但只考虑 public 方法。

若要考虑类型层次结构中的非公共方法,您必须在未找到方法时自行遍历超类。

【讨论】:

    猜你喜欢
    • 2019-01-22
    • 1970-01-01
    • 2021-08-05
    • 2021-09-03
    • 2015-04-22
    • 2019-04-19
    • 1970-01-01
    • 1970-01-01
    • 2016-01-08
    相关资源
    最近更新 更多