覆盖标准JVMexception的fillInStackTrace

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

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

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

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

NewException is never thrown in body of corresponding trystatement 

谢谢

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

最好的办法是将getMethod()调用缓存在一个中心位置:只需创建一个两级映射: Map>并使用快速查找而不会抛出任何exception。

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


我确认你的表现指标。

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

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

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


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