我正在尝试创建一个方法invokeMethod(String methodName, Object...args)
,该方法可以在当前实例上调用父类的方法。我尝试了以下实现。
public void invokeMethod(String methodName, Object...args) {
//Array to hold the classes of the arguments
Class<?>[] classes = new Class<?>[args.length];
//Initialize each class in the array to the class of each argument
for(int i = 0; i < args.length; i++)
classes[i] = args[i].getClass();
try {
//find the method
Method m = this.getClass().getMethod(methodName, classes);
//invoke the method
m.invoke(this, args);
} catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
e.printStackTrace();
}
}
这种实现的问题是,如果我尝试调用一个具有原始参数的方法,我会收到一个
NoSuchMethodException
异常,因为它正在寻找具有相应包装类类型的参数的方法。例如,如果我尝试通过
invokeMethod("line", 50f, 50f, 50f, 50f)
调用一个签名为 line(float, float, float, float)
的方法,我会得到一个类似于异常的结果。java.lang.NoSuchMethodException: DynamicSketch.line(java.lang.Float, java.lang.Float, java.lang.Float, java.lang.Float)
at java.base/java.lang.Class.getMethod(Class.java:2109)
at DynamicSketch.invokeMethod(DynamicSketch.java:32)
at DynamicSketch.setup(DynamicSketch.java:19)
at processing.core.PApplet.handleDraw(PApplet.java:2412)
at processing.awt.PSurfaceAWT$12.callDraw(PSurfaceAWT.java:1557)
at processing.core.PSurfaceNone$AnimationThread.run(PSurfaceNone.java:316)
有没有办法让我使用
invokeMethod
方法处理基本类型参数?编辑:解决方案在这里不能用,因为我不知道在执行我的方法时签名中有哪些基本类型。我想要能够执行像
size(int, int)
和line(float, float ,float ,float)
这样的方法,而链接中的解决方案不易于实现此功能。我唯一看到的解决方案是定义一个if语句来处理超类中可能出现的每个方法,然后使用链接中的解决方案,但我希望有一种更简单的方法。
getMatchingMethod
的主要好处是我不需要this.getClass()
部分,而且这个库有更多调用方法的选项。我理解得对吗? - LindstorminvokeXyzMethod
方法,也许其中一个对你有所帮助。 - Andrey Tyukin