java - 反射:获取具有任意数量参数的方法并按原样使用它

标签 java reflection

我想使用我使用的第 3 方包中的方法。这是签名:

java.lang.String buildMenuPath(java.lang.Object... objects);

该方法可以按如下方式使用(仅举几例):

  1. buildMenuPath(1,1,1) //3 ints
  2. buildMenuPath("str",1,1) // 1 string 2 ints
  3. buildMenuPath("str",1) // 1 string 1 int

通过反射(reflection),我尝试获取这个方法并遵循用法#2和#3。

尝试#1,获取我将使用的确切签名 ( String.class, Integer.class )

ArrayList pathArr = new ArrayList();
pathArr.add("Window");
pathArr.add(i);
Method method  = myObj.getClass().getMethod("buildMenuPath",String.class, Integer.class);
method.invoke(myObj,pathArr.toArray())
  • 抛出:java.lang.NoSuchMethodException

尝试#2,获取任意参数方法:

ArrayList pathArr = new ArrayList();
pathArr.add("Window");
pathArr.add(i);
Method method  = myObj.getClass().getMethod("buildMenuPath",Object[].class);
method.invoke(myObj,pathArr.toArray())
  • 看起来它获取了方法但抛出:java.lang.IllegalArgumentException

但是如果我手动调用 myObj.buildMenuPath("Window",6);它有效。

如何通过反射来解决这个问题?

最佳答案

您需要知道函数的确切签名(查看文档),例如,它可能采用对象类型参数的变量列表,或者它可能被重载,但参数类型可能不是String int

最后,在调用 Invoke() 时,将参数数组强制转换为 (Object)

就您而言,应该是:

ArrayList pathArr = new ArrayList();
pathArr.add("Window");
pathArr.add(i);
Method method  = myObj.getClass().getMethod("buildMenuPath",Object[].class);
method.invoke(myObj,(Object)pathArr.toArray())

关于java - 反射:获取具有任意数量参数的方法并按原样使用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49871006/

相关文章:

java - REST POST 不支持的媒体类型

java - Spring JmsTemplate 的守护线程在停止 tomcat 应用程序后仍保持 Activity 状态

C# 反射 : Finding Attributes on a Member Field

Java while循环及其他

java - 简单的密码和 I/O

c# - 确定 .NET 类型是否是动态的(使用 Reflection.Emit 创建)

angular - 如何获取绑定(bind) [(ngModel)] 的属性名称? Angular 6

c# - 将 MethodInfo 连接到委托(delegate)字段 (FieldInfo)

c# - 来自静态反射的动态场?

基于 Java Regex 的字符串替换