【问题标题】:Java reflection error: NoSuchMethodExceptionJava 反射错误:NoSuchMethodException
【发布时间】: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


【解决方案1】:

您应该在getDeclaredMethod 中添加一个参数类型作为第二个参数。你应该传递一些东西(更好的null)作为调用静态方法的第一个参数。

String hashType = "md5";
Method method = DigestUtils.class.getDeclaredMethod(hashType + "Hex", String.class);
String hash = (String) method.invoke(null, "hello");

对于非静态方法,您可以这样做:

DigestUtils instance = new DigestUtils();
String hash = (String) method.invoke(instance, "hello");

【讨论】:

  • 对于静态方法,您应该使用 null - 但参数只是被忽略,所以这不是一个大问题,您可以使用任何东西。但是使用任何参数看起来可能是这个方法的目标。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-18
  • 2018-08-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多