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 ...)
您可能对Commons BeanUtilsApache库感兴趣,特别是这个方法:http:
//commons.apache.org/beanutils/v1.8.0/apidocs/org/apache/commons/beanutils/MethodUtils.html#getMatchingAccessibleMethod%28java.lang.Class, %20java.lang.String,%20java.lang.Class%5B%5D 29%
希望这可以帮助