我有一个使用第三方库的项目。但是,只有当用户在项目中复制了这些 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() 方法创建反射方法?
你可以尝试用这样的方法调用它:
B[] bObjectArray = <array of Bs>;
methodAReflected.invoke(aObject, (Object) bObjectArray);
您还可以查看来自 Oracle 的官方tutorial,在Invoking Methods with a Variable Number of Arguments部分您可以找到使用您需要的类似方法的示例。
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());