如果我运行以下程序:
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));
}
};
我在命令行上得到以下信息:
true
另一方面,如果我稍微修改一下参数行:
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));
}
};
我得到:
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)
从这个示例来看,在我看来,getMethod
方法仅适用于精确的参数。有没有办法获得某种形式的“最适合”方法?例如如果存在完全匹配,它将返回该方法,但如果不存在完全匹配,它可以返回任何可以接受我给定参数的方法。
最佳答案
您可能会对 Apache Commons Lang MethodUtils 类有更好的运气,它有一个方法“invokeMethod”,该方法使用该方法的目标参数来缩小适当的类型范围(即,您不必告诉它参数类型)。
这似乎有效:
System.out.println(MethodUtils.invokeMethod("what?", "equals", new Object[] {"what?"}));
有关更多详细信息,请参阅 javadocs:http://commons.apache.org/lang/api/org/apache/commons/lang3/reflect/MethodUtils.html#invokeMethod(java.lang.Object,%20java.lang.String,%20java.lang.Object ...)
关于java - 在 Java 中获得最合适的实例方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11110579/