在Java中获得最适合的实例方法

mat*_*ots 2 java reflection methods

如果我运行以下程序:

class Runit{
    public static void main(String[] argsWut) throws Exception {
        String arg = "what?";
        Class[] parameters = { new Object().getClass() };
        Object[] args = { arg };
        System.out.println("".getClass().getMethod("equals",parameters).invoke("what?",args));
    }
};
Run Code Online (Sandbox Code Playgroud)

我在命令行上得到以下内容:

true
Run Code Online (Sandbox Code Playgroud)

另一方面,如果我修改参数行一点:

class Runit{
    public static void main(String[] argsWut) throws Exception {
        String arg = "what?";
        Class[] parameters = { arg.getClass() }; // changed a little here so it's a bit more dynamic --
        Object[] args = { arg };
        System.out.println("".getClass().getMethod("equals",parameters).invoke("what?",args));
    }
};
Run Code Online (Sandbox Code Playgroud)

我明白了:

Exception in thread "main" java.lang.NoSuchMethodException: java.lang.String.equals(java.lang.String)
    at java.lang.Class.getMethod(Class.java:1605)
    at test.Runit.main(Runit.java:7)
Run Code Online (Sandbox Code Playgroud)

从这个例子中,它看起来好像该getMethod方法只适用于精确的参数.有没有办法获得某种形式的"最佳"方法?例如,如果存在完全匹配,它将返回该方法,但如果不存在完全匹配,则它可以返回任何可以接受我给定参数的方法.

小智 5

你可能对Apache Commons Lang MethodUtils类有更好的运气,它有一个方法"invokeMethod",它使用方法的目标参数来缩小适当的类型(即,你不必告诉它参数类型).

这似乎有效:

 System.out.println(MethodUtils.invokeMethod("what?", "equals", new Object[] {"what?"}));
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅javadocs:http://commons.apache.org/lang/api/org/apache/commons/lang3/reflect/MethodUtils.html#invokeMethod(java.lang.Object,%20java.lang.String,% 20java.lang.Object ...)