代码之家  ›  专栏  ›  技术社区  ›  Daff

意外的Class.GetMethod行为

  •  3
  • Daff  · 技术社区  · 16 年前

    不久前我有一个 similar question 当使用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);
        }
    }
    

    string.class实现了可序列化接口,我真的希望它包含在查找方法中。 在我自己的查找算法中也必须考虑这个问题吗?

    编辑 我读过JavaDoc, 所以让我强调问题的第二部分 :如果是这样,您对如何快速实现这一点有什么建议吗(我已经添加了一些自定义匹配和转换算法,我不希望太慢)?

    4 回复  |  直到 16 年前
        1
  •  5
  •   BalusC    16 年前

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

    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"));
                    }
                }
            }
        }
    
    }
    

    这个应该打印出来 foo 停顿。

        2
  •  4
  •   skaffman    16 年前

    JavaDoc Class.getMethod 非常明确:

    参数类型参数是 类对象数组,用于标识 方法的形参类型, 按声明的顺序。

    它不提供子类型的范围。

        3
  •  1
  •   Jon Skeet    16 年前

    getMethod 不是为了找到 兼容的 对于给定的参数类型-它用于查找 确切地 给定的参数类型。

    你得打电话 getMethods() 要找到所有的方法,然后根据参数的名称和数量进行过滤,然后计算出哪些方法是实际适用的。

        4
  •  0
  •   fastcodejava    16 年前

    你为什么要打电话 getMethod 具有 String.class ?方法签名完全映射。按照与调用方法相同的条件查找方法没有任何意义。