【发布时间】:2014-05-17 13:17:00
【问题描述】:
我正在创建一个实用函数,它返回一个Method 对象给它的所有部分。其参数:
- 返回类型 (
Class<?>) - 包含类 (
Class<?>[]) - 函数名(
String) - 参数类数组(
Class<?>[])
注意包含类参数是一个数组。这些类中的一个必须包含该方法,但您不知道是哪一个。这是一种指定默认类的方法,除了可能明确指定的类。
我的目标是按顺序搜索此数组中的每个类,如果它包含该方法,则返回其Method 对象。我想这样做,而不必尝试捕获 NoSuchMethodException(如 this question 中所述)。由于该方法可能是私有的,因此无法使用Class.getMethods()。
(它也允许私有静态,但我不确定这是否会影响这个问题。)
你如何以这种方式搜索私有方法?如何进行“类中是否存在函数”测试,而不必使用NoSuchMethodException 作为“假”逻辑?
更多信息:https://www.google.com/search?q=class+contains+method+java
【问题讨论】:
-
你不想抓住
NoSuchMethodError。您是否也反对捕获NoSuchMethodException,这不是一回事?因为最直接的答案是使用getDeclaredMethod(不是getDeclaredMethods)并抓住NoSuchMethodException。但是,如果您不想抓住NoSuchMethodException,我不会费心将其发布为答案。 -
@DavidWallace:我的目标是避免捕获异常来代替逻辑。也许你会告诉我为什么我错了。或者你可能不会。
-
是的,我指的是异常,而不是错误。
-
我发现在某些情况下无法避免捕获逻辑异常。最常见的情况是当您试图判断字符串是否代表数字时,您可以执行
Long.parseLong(myString)之类的操作并捕获NumberFormatException。我认为这是 API 的一个弱点——似乎没有更好的方法来做到这一点。如果Long.parseLong返回Long而不是long并且返回null而不是抛出异常,我实际上会更喜欢它。但我们使用我们所得到的。同样,如果getDeclaredMethod返回null当方法 ... -
... 不存在。但我并没有超过
NoSuchMethodException,因为我们使用 API 给我们的东西。现在NoSuchMethodError是另一个故事,因为如果我们实际上尝试运行一个不存在的方法,就会抛出这个问题,而且我不会梦想试图抓住这个。但我认为捕获NoSuchMethodException是无害且必要的。
标签: java reflection