Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 意外的Class.getMethod行为_Java_Reflection - Fatal编程技术网

Java 意外的Class.getMethod行为

Java 意外的Class.getMethod行为,java,reflection,Java,Reflection,不久前,我在使用Class.getMethod和自动装箱时遇到了一个问题,在您自己的查找算法中实现这一点很有意义。但真正让我有点困惑的是,以下内容也不起作用: public class TestClass { public String doSomething(Serializable s) { return s.toString(); } public static void main(String[] args) throws Securit

不久前,我在使用Class.getMethod和自动装箱时遇到了一个问题,在您自己的查找算法中实现这一点很有意义。但真正让我有点困惑的是,以下内容也不起作用:

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);
    }
}
class实现了可序列化接口,我真的希望它包含在查找方法中。在我自己的查找算法中也必须考虑这一点吗?


编辑:我确实阅读了Javadoc,所以让我强调问题的第二部分:如果是这样,您对如何快速完成这一任务有何建议(我已经添加了一些自定义匹配和转换算法,我不希望它变得太慢)?

getMethod
并不是为了找到与给定参数类型兼容的方法,而是为了找到与给定参数类型完全兼容的方法


您需要调用
getMethods()
来查找所有方法,然后按名称和参数数量进行筛选,然后确定哪些参数实际适用。

为什么要使用
String.class
调用
getMethod
?方法签名被精确映射。如果要调用方法,那么按照相同的条件查找方法是没有任何意义的。

的javadoc非常明确:

parameterTypes参数是一个 标识 方法的形式参数类型, 按照宣布的顺序


它不提供子类型的作用域

根据您的编辑,您可以使用。下面是一个基本的启动示例(将明显的(运行时)异常处理放在一边):

这应该将
foo
打印到标准输出

package com.stackoverflow.q2169497;

import java.io.Serializable;
import java.lang.reflect.Method;

public class Test {

    public String doSomething(Serializable serializable) {
        return serializable.toString();
    }

    public static void main(String[] args) throws Exception {
        Test test = new Test();
        for (Method method : test.getClass().getMethods()) {
            if ("doSomething".equals(method.getName())) {
                if (method.getParameterTypes()[0].isAssignableFrom(String.class)) {
                    System.out.println(method.invoke(test, "foo"));
                }
            }
        }
    }

}