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

标签 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));
    }
};

我在命令行上得到以下信息:

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/

相关文章:

java.lang.错误: Unresolved compilation problem for singelton class

java - 使用 Apache DBCP 的多线程

java - JNI : passing bytes from c++ to java

java - 如何使用eclipse打包jar文件而不包含依赖jar库?

java - 求一个数的因数的方法

Java:setRequestMethod 不起作用

java - 如何调用抽象类的私有(private)构造函数进行模拟。

c# - 改进属性(property)监控代码?

c# - 从 ConstantExpression 获取值

c# - 如何在其他类中使用方法?