java - 通过 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 没有带有名称方法的方法,我只是将它用于示例。
解决方案
您必须为查找方法指定参数类型,而不是调用方法:
void invoke(Object object, String methodName, int id) throws ReflectiveOperationException {
object.getClass().getDeclaredMethod(methodName, int.class).invoke(object, id);
}
但请记住,它getClass()
返回实际类,它可能是预期类的子类,而getDeclaredMethod
不会搜索超类。getMethod
确实搜索超类,但只考虑public
方法。
要考虑类型层次结构中的非公共方法,您必须在未找到该方法时自己遍历超类。
推荐阅读
- pandas - 在 Databricks DBFS 中保存数据帧字典
- php - 未定义变量:worklogs_yesterday(查看:/home/riwaj/Desktop/projects/dmt-intern-manager/InternManager/resources/views/home.blade.php)
- wpf - 自定义 DatagridTemplateColumn 按钮 - 将按钮内容绑定到自定义列属性
- r - 根据 data.table 中的列列表过滤条件
- java - 在 Android Studio 中访问 aar 文件的类时出现 classNotFoundException
- c - 如何使用 microsoft azure client sdk c 从 iot hub 消息中获取 EventEnqueuedUtcTime
- reactjs - Material Ui table 减少列间距
- typo3 - 如何交付在模板外创建的 TYPO3 Fluid Form 元素?
- java - Android中随机输出中的EditText所有可能的数字
- java - 为什么这个二进制搜索代码在 Eclipse IDE 上给出错误的输出?