簡體   English   中英

意外的Class.getMethod行為

[英]Unexpected Class.getMethod behaviour

前一段時間我在使用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實現了Serializable接口,我真的希望它包含在查找方法中。 我是否也必須在自己的查找算法中考慮這一點?

編輯 :我確實讀過Javadoc, 所以讓我強調問題的第二部分 :如果是這樣,你有關於如何快速做到這一點的建議(我已經不得不添加一些自定義匹配和轉換算法,我不想要它太慢了?)

根據您的編輯,您可以使用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到stdout。

Class.getMethod的javadoc非常明確:

parameterTypes參數是一個Class對象數組,它按聲明的順序標識方法的形式參數類型。

它沒有提供子類型的范圍。

getMethod並不是要找到與給定參數類型兼容的方法 - 它的目的是找到具有完全給定參數類型的方法。

您需要調用getMethods()來查找所有方法,然后按名稱和參數數量進行篩選,然后確定哪些方法實際適用。

為什么要用String.class調用getMethod 方法簽名完全映射。 按照與調用它們相同的標准查找方法沒有任何意義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM