首页 > 解决方案 > 通过 Reflection Api 访问重载方法

问题描述

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

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.getDeclaredMethod https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html的文档还有一篇关于 SO 的旧帖子,但两个来源都没有回答同一个问题 How在Java中找到一个重载的方法?. 当然 Class.Object 没有带有名称方法的方法,我只是将它用于示例。

标签: javareflection

解决方案


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

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

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

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


推荐阅读