2009-10-05 75 views
1

如果我使用反射,并且想要查找是否实现了方法,那么我可以使用getMethod()方法。这个方法抛出一个NoSuchMethodException异常。覆盖标准JVM的fillInStackTrace例外

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

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

所以我不想太侵入。如果我创建延伸的Throwable类,并使用这个新的类,而不是NoSuchMethodException,我有这样的:

NewException is never thrown in body of corresponding trystatement 

感谢

回答

1

没有,因为getMethod()电话new直接因为类是有符号,你不能代替代码NoSuchMethodExceptionfillInStackTrace()native

最好的办法是将呼叫缓存到getMethod()在一个中心位置:只需创建一个两级地图:Map<Class, Map<String, Method>>并使用快速查找,无任何异常投掷。

+0

但如果我有很多很多类,地图将是巨大的。我将不得不大幅改变框架。难... – LB40 2009-10-05 16:36:02

+0

所以我发现调用getMethods并遍历数组似乎更快。谢谢您的帮助。我能够以这种方式将呼叫打包到getMethod。 – LB40 2009-10-05 18:20:55

1

我的两个以下几点做的不完全的解决方案标题你的问题,但我认为他们可能是有帮助的...


我确认您的性能指标。

我在Java性能手册中阅读了解决方案。我们已经将它应用于我们自己的应用程序,但有一些例外(堆栈跟踪不重要,可能的频率很高)。我不知道你是否会喜欢它; ;-)

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

当您不想打扰依赖于例外的现有流程时,这似乎很理想。


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

+0

关于第一个解决方案,我不能这样做,因为我不会抛出异常。我认为我的第一个解决方案是非常愚蠢的,因为我犯了混乱投掷和捕捉的错误,即使我发现我自己的异常并不意味着这是一个抛出.. – LB40 2009-10-05 16:30:43