我面临着一些我认为无法解决的问题,但值得一试。假设您有以下课程:
package a;
public class A
{
protected A() {}
public static void staticMethod(A a) {
// ...
}
}
public class B extends A
{
public B() {}
}
所以你可以从其他包中实例化B
,但不是A
. 现在假设您要使用Class.getMethod
,只有您使用某种反身框架,例如:
public Object callStaticMethod(Class c, String methodname, Object[] args)
{
Class[] signature = new Class[args.length];
for (i = 0 ; i < args.length ; ++i) {
signature[i] = args.getClass();
}
Method m = c.getMethod("methodname", signature);
return m.invoke(null, args)
}
这种方法是按原样提供给我的,遗憾的是我无法改进它。现在您可能想要这样调用该方法:
package b;
B b;
callStaticMethod(A.class, "staticMethod", b);
...除了那不起作用,因为生成的签名(基于getClass()
结果将是{B.class}
,并且没有调用staticMethod
以A
aB
作为参数的方法。
你们有人知道吗?
奖励:作为一个额外的挑战,有没有办法用这个方法来调用staticMethod
一个空参数(这在语义上也可能是完全有效的)?我个人还没有找到方法。