1

我面临着一些我认为无法解决的问题,但值得一试。假设您有以下课程:

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},并且没有调用staticMethodAaB作为参数的方法。

你们有人知道吗?

奖励:作为一个额外的挑战,有没有办法用这个方法来调用staticMethod一个空参数(这在语义上也可能是完全有效的)?我个人还没有找到方法。

4

1 回答 1

3

你必须做的是使用类似的东西Class.getMethods,然后检查每个候选方法的适用性。您不妨考虑:

  • 装箱(因此对于 中的值long.class有效)Longargs
  • Varargs(因此,如果您有两个String参数,您可能需要考虑对 的方法有效foo(String... args)
  • 空兼容性(基本上与任何类类型参数)
  • 分配兼容性(可能通过Class.isAssignableFrom
  • 泛型(这几乎肯定会被证明是可怕的)

If there are multiple applicable candidate methods, you may want to consider emulating the Java overloading rules - but I'd probably avoid it and go bang if you can :)

于 2012-09-07T18:58:08.263 回答