在 Java 反射的情况下,如何将参数作为 relfected 类的可变参数传递给调用方法?

问题描述 投票:0回答:2

我有一个使用第三方库的项目。但是,只有当用户在项目中复制了这些 jar 或者使用现有的 jar 时,我才需要调用第三方的方法。 为此,我使用反射来创建类并从第三方库调用方法.

库中的一个方法需要来自同一个库的另一个类的可变参数作为参数。由于这两个类都是在我的主类中使用反射创建的,并且它们的相应方法也是使用反射创建的,我们如何将参数作为类的可变参数传递给方法名。invoke() 方法?

请参考前面的代码片段。

//--------A级----------------

package com.demoA;

Class A {
   public void methodA(B... b) {
      // Contents of methodA...
   }
}

//------B级----------------

package com.demoB;

Class B {
    // contents of class B here...
}

//--------类主类------------

package com.mainclass;

Class MainClass {
    public static void main(String[] args) {
        Class<?> azz = Class.forName("com.demoA.A");
        Object aObject = azz.getDeclaredConstructor().newInstance();
        Method methodAReflected = null;
    
        for (Method m : azz.getMethods) {
            if (m.getName.equals("methodA")) {
                methodAReflected = m;
            }
        }
        
          Class bzz = Class.forName("com.demoB.B");
          Object bObject = bzz.getDeclaredConstructor().newInstance();
        
          methodAReflected.invoke(aObject, <how to pass varargs here>);
          // Passing only bObject or new Object[] { bObject } result in an IllegalArgumentException : type mismatch
    
    }
}

此外,当预期参数为可变参数时,是否有更好的方法(而不是遍历方法名称)使用 Java 反射的 getMethod() 方法创建反射方法?

java reflection variadic-functions
2个回答
0
投票

你可以尝试用这样的方法调用它:

B[] bObjectArray = <array of Bs>;
methodAReflected.invoke(aObject, (Object) bObjectArray);

您还可以查看来自 Oracle 的官方tutorial,在Invoking Methods with a Variable Number of Arguments部分您可以找到使用您需要的类似方法的示例。


0
投票

使用

Array.newInstance
创建一个新数组,并使用
Array.set
设置它的元素。

Object methodAVarargs = Array.newInstance(bzz, 1);
Array.set(methodAVarargs, 0, bObject);
methodAReflected.invoke(aObject, methodAVarargs);

要找到代码更短的方法,可以使用

get(Declared)Method
并传递arrayType
bzz

Method methodAReflected = azz.getDeclaredMethod("methodA", bzz.arrayType());
© www.soinside.com 2019 - 2024. All rights reserved.