java - 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)
很适合。如何找到适合以下类的方法,而不仅仅是具有相同的签名?该方法也应该适用于多个参数。
解决方案
我相信那是因为Java找不到具有确切签名的方法......
那是对的。反射 API 不支持这一点。在反射性地查找方法时,没有简单的方法可以复制 Java 的(静态)方法重载决议。
不简单的方法是:
- 识别所有实现的类和接口
MyClass
。(你可以反思地做到这一点。) - 调用
PrintStream.class.getMethod("print", type)
这些类/接口类型中的每一个。 - 如果您从第 2 步得到多个结果,请使用一些启发式方法来确定哪种方法是“最好的”方法。(它不一定是反映 JLS 所做的事情,尽管这可能是“最不令人惊讶”的使用方法。)
有 3rd 方库可以为您执行此操作;看看这个问答以获得一些建议:
推荐阅读
- reactjs - 在 node_modules/jest-diff/build/diffLines.d.ts 中构建时出现 React + Typescript 错误
- java - 在 JPA 中使用 Postgresql lpad 函数,但无法执行
- javascript - 在 Tone.js 中将音频样本量化为网格
- javascript - 在 npm create-react-app 之后立即运行测试非常慢
- haskell - Haskell:我已经解释过的模式会出现非详尽模式错误
- angular - 角火库;查询参数的最佳实践
- java - Apache Flink - 外部 Jar
- javascript - 如何重定向到另一个页面并在Angular ng-click上调用一个函数
- sql - 将 int 拆分为时间格式
- java - 概念问题。创建类 JButton 的对象后 JButton 存在。模拟试题