覆盖标准JVM异常的fillInStackTrace

时间:2009-10-05 15:43:21

标签: java exception nosuchmethoderror

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

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

我正在使用一个框架,使用异常作为执行某种控制流的方法。

所以我不想过于侵略。如果我正在创建一个扩展Throwable的类并使用这个新类而不是NoSuchMethodException,我有类似的东西:

NewException is never thrown in body of corresponding trystatement

感谢

2 个答案:

答案 0 :(得分:1)

  

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


我确认你的表现指标。

我在java性能手册中读到了一个解决方案。我们已将此应用于我们自己的应用程序,例如(堆栈跟踪不重要,可能的频率很高)。我不知道你是否愿意...; - )

创建Exception类的唯一实例,并将其存储。扔掉那个实例

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


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

答案 1 :(得分:1)

不,由于getMethod()直接调用new,因此您无法替换NoSuchMethodException的代码,因为该类已签名且fillInStackTrace()native

最好的办法是在中央位置缓存getMethod()的呼叫:只需创建一个两级映射:Map<Class, Map<String, Method>>并使用快速查找而不会抛出异常。