1

如果我正在使用反射并且我想查找是否实现了某个方法,我可以使用 getMethod() 方法。此方法引发 NoSuchMethodException。

有没有办法重载这个异常的 fillInStackTrace 来优化性能?现在,大约 40% 的时间都花在了这个方法上。

我正在使用一个使用异常的框架来执行某种控制流。

所以我不想太具有侵略性。如果我正在创建一个扩展 Throwable 的类并使用这个新类而不是 NoSuchMethodException,我会遇到类似的情况:

NewException is never thrown in body of corresponding trystatement

谢谢

4

2 回答 2

1

我的以下两点并不能完全解决您问题的标题,但我认为它们可能会有所帮助...


我确认您的绩效衡量标准。

我在一本 java 性能书籍中读到了一个解决方案。我们已将此应用于我们自己的应用程序,但有一些例外情况(堆栈跟踪并不重要,并且可能的频率很高)。我不知道你是否会喜欢它... ;-)

创建 Exception 类的唯一实例,存储它。抛出那个实例

当您不想干扰依赖异常的现有流程时,这似乎很理想。


如果您的编译器抱怨其他方法没有抛出该异常,那是因为您选择了已检查的异常。
使用RuntimeException的子类(它们是未经检查的,所以编译器不知道它们是否被抛出,他不会抱怨)。

于 2009-10-05T15:47:54.553 回答
1

不,因为直接getMethod()调用new并且您不能替换代码,NoSuchMethodException因为该类已签名并且fillInStackTrace()native.

您最好的选择是将调用缓存getMethod()在一个中心位置:只需创建一个两级映射:Map<Class, Map<String, Method>>并使用快速查找而不抛出任何异常。

于 2009-10-05T15:52:06.527 回答