代码之家  ›  专栏  ›  技术社区  ›  LB40

重写标准JVM异常的FillInstackTrace

  •  1
  • LB40  · 技术社区  · 15 年前

    如果我使用的是反射,我想知道是否实现了一个方法,我可以使用getmethod()方法。此方法引发NoSuchMethodException。

    是否有方法重载此异常的FillInstackTrace以优化性能?现在,大约40%的时间都花在了这个方法上。

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

    所以我不想太有侵略性。如果我正在创建一个扩展throwable的类,并使用这个新类而不是nosuchMethodException,我会得到如下的结果:

    NewException is never thrown in body of corresponding trystatement
    

    谢谢

    2 回复  |  直到 15 年前
        1
  •  1
  •   Aaron Digulla    15 年前

    不,因为 getMethod() 电话 new 不能直接替换 NoSuchMethodException 因为班级是签名的 fillInStackTrace() native .

    您的最佳选择是将呼叫缓存到 GET方法() 在中心位置:只需创建一个两级地图: Map<Class, Map<String, Method>> 并使用快速查找而不引发任何异常。

        2
  •  1
  •   KLE rslite    15 年前

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


    我确认你的表现。

    我在Java性能书中读到了一个解决方案。对于某些异常(堆栈跟踪不重要,可能的频率很高),我们已经将其应用于自己的应用程序。我不知道你会不会喜欢…;-)

    创建异常类的唯一实例,并存储它。抛出那个实例 .

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


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