如果我正在使用反射,并且我想查找是否实现了方法,我可以使用getMethod()方法。此方法抛出NoSuchMethodException。
有没有办法重载此Exception的fillInStackTrace以优化性能?现在,大约40%的时间花在了这个方法上。
我正在使用一个框架,使用异常作为执行某种控制流的方法。
所以我不想过于侵略。如果我正在创建一个扩展Throwable的类并使用这个新类而不是NoSuchMethodException,我有类似的东西:
NewException is never thrown in body of corresponding trystatement
感谢
答案 0 :(得分:1)
我的以下两点并未完全解决您问题的标题,但我认为它们可能会有所帮助......
我确认你的表现指标。
我在java性能手册中读到了一个解决方案。我们已将此应用于我们自己的应用程序,例如(堆栈跟踪不重要,可能的频率很高)。我不知道你是否愿意...; - )
创建Exception类的唯一实例,并将其存储。扔掉那个实例。
当您不想打扰依赖异常的现有流时,这似乎是理想的。
如果您的编译器抱怨其他方法没有抛出该异常,那是因为您选择了一个已检查的异常 使用 RuntimeException的子类(它们未被选中,因此编译器不知道它们是否被抛出,他不会抱怨)。
答案 1 :(得分:1)
不,由于getMethod()
直接调用new
,因此您无法替换NoSuchMethodException
的代码,因为该类已签名且fillInStackTrace()
为native
。
最好的办法是在中央位置缓存getMethod()
的呼叫:只需创建一个两级映射:Map<Class, Map<String, Method>>
并使用快速查找而不会抛出异常。