首页 > 解决方案 > Java反射查找方法

问题描述

我在使用 Java 查找方法时遇到问题,例如,我必须通过反射将值打印到 System.out:

public static void print(Object value) {
    Method method = PrintStream.class.getMethod("print", value.getClass());
    method.invoke(System.out, value);
}

它适用于字符串,但是当我传递 的实例时MyClass,例如,我收到以下错误:

java.lang.NoSuchMethodException: java.io.PrintStream.print(MyClass)
    at java.lang.Class.getMethod(Class.java:1786)
    at Test.print(Test.java:20)
    at Test.main(Test.java:15)

我相信这是因为 Java 找不到具有确切签名的方法,但这里java.io.PrintStream.print(java.lang.Object)很适合。如何找到适合以下类的方法,而不仅仅是具有相同的签名?该方法也应该适用于多个参数。

标签: javareflection

解决方案


我相信那是因为Java找不到具有确切签名的方法......

那是对的。反射 API 不支持这一点。在反射性地查找方法时,没有简单的方法可以复制 Java 的(静态)方法重载决议。

不简单的方法是:

  1. 识别所有实现的类和接口MyClass。(你可以反思地做到这一点。)
  2. 调用PrintStream.class.getMethod("print", type)这些类/接口类型中的每一个。
  3. 如果您从第 2 步得到多个结果,请使用一些启发式方法来确定哪种方法是“最好的”方法。(它不一定是反映 JLS 所做的事情,尽管这可能是“最不令人惊讶”的使用方法。)

有 3rd 方库可以为您执行此操作;看看这个问答以获得一些建议:


推荐阅读