相关疑难解决方法(0)

带有子类参数的Java getMethod

我正在编写一个使用反射来动态查找和调用方法的库.只给出一个对象,一个方法名和一个参数列表,我需要调用给定的方法,就好像方法调用是在代码中显式编写的一样.

我一直在使用以下方法,在大多数情况下都可以使用:

static void callMethod(Object receiver, String methodName, Object[] params) {
    Class<?>[] paramTypes = new Class<?>[params.length];
    for (int i = 0; i < param.length; i++) {
        paramTypes[i] = params[i].getClass();
    }
    receiver.getClass().getMethod(methodName, paramTypes).invoke(receiver, params);
}
Run Code Online (Sandbox Code Playgroud)

但是,当其中一个参数是方法支持的类型之一的子类时,反射API会抛出一个NoSuchMethodException.例如,如果接收者的类已testMethod(Foo)定义,则以下操作失败:

receiver.getClass().getMethod("testMethod", FooSubclass.class).invoke(receiver, new FooSubclass());
Run Code Online (Sandbox Code Playgroud)

尽管这有效:

receiver.testMethod(new FooSubclass());
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?如果方法调用是硬编码的,则没有问题 - 编译器只使用重载算法来选择最适用的方法.但它不适用于反射,这是我需要的.

提前致谢!

java reflection polymorphism subclass

10
推荐指数
1
解决办法
4325
查看次数

意外的Class.getMethod行为

前一段时间我在使用Class.getMethod和autoboxing时遇到了类似的问题,在你自己的查找算法中实现它是有意义的.但真正让我感到困惑的是,以下内容无效:

public class TestClass
{
    public String doSomething(Serializable s)
    {
        return s.toString();
    }

    public static void main(String[] args) throws SecurityException, NoSuchMethodException
    {
        TestClass tc = new TestClass();
        Method m = tc.getClass().getMethod("doSomething", String.class);
    }
}
Run Code Online (Sandbox Code Playgroud)

String.class实现了Serializable接口,我真的希望它包含在查找方法中.我是否也必须在自己的查找算法中考虑这一点?

编辑:我确实读过Javadoc,所以让我强调问题的第二部分:如果是这样,你有关于如何快速做到这一点的建议(我已经不得不添加一些自定义匹配和转换算法,我不想要它太慢了?)

java reflection

3
推荐指数
1
解决办法
1306
查看次数

标签 统计

java ×2

reflection ×2

polymorphism ×1

subclass ×1