【发布时间】:2018-08-13 23:26:53
【问题描述】:
我刚刚阅读了有关反射并决定尝试一下,但我似乎遇到了一个我找不到原因的错误。
我在课堂上得到以下代码:
String hashType = "md5";
Method method = DigestUtils.class.getDeclaredMethod(hashType + "Hex");
String hash = (String) method.invoke("hello");
这段代码应该将哈希字符串存储到变量哈希中,在运行时抛出以下错误:
java.lang.NoSuchMethodException: org.apache.commons.codec.digest.DigestUtils.md5Hex()
at java.lang.Class.getDeclaredMethod(Unknown Source)
at stringHasher.stringHasher.hashString(stringHasher.java:37)
根据 API 文档,该方法确实存在:https://commons.apache.org/proper/commons-codec/apidocs/org/apache/commons/codec/digest/DigestUtils.html
除了不明白这个错误的原因是什么之外,我也不明白为什么我需要将该方法的返回值转换为一个字符串,因为 API 声明它返回一个字符串(类型安全是否应该掌握在手中?在这种情况下不是由 Eclipse 强制执行的程序员?)。
【问题讨论】:
-
有 3 种不同的方法称为
md5Hex,但它们都有一个参数。您没有在getDeclaredMethod调用中声明任何参数,因此它会查找不存在不存在参数md5Hex()的方法。但是我可以问一下为什么在这种情况下你要使用反射吗?如果你想要类型安全,直接调用方法而不使用反射似乎是一个更好的解决方案。 -
正如@OHGODSPIDERS 所说,有3种方法称为md5Hex。所以试试这个:
DigestUtils.class.getDeclaredMethod(hashType + "Hex", String.class); -
我正在使用它,因为我想尝试一下,看看我是否可以让它工作。我以后可能会用它来减少代码。如何在 getDeclaredMethod 调用中声明参数?
-
@BilalELCHAMI 谢谢。
标签: java reflection