Substituindo fillInStackTrace para Exceções da JVM Padrão

Se estou usando reflection e quero descobrir se um método é implementado ou não, posso usar o método getMethod (). Este método lança um NoSuchMethodException.

Existe uma maneira de sobrecarregar o fillInStackTrace desta exceção para otimizar o desempenho? Neste momento, cerca de 40% do tempo é gasto neste método.

Estou usando uma estrutura usando exceções como uma forma de executar um determinado tipo de stream de controle.

Então eu não quero ser muito invasivo. Se eu estou criando uma class extendendo Throwable e usando essa nova class em vez de NoSuchMethodException, estou tendo algo como:

NewException is never thrown in body of corresponding trystatement 

obrigado

Não, já que getMethod() chama new diretamente e você não pode replace o código para NoSuchMethodException já que a class é assinada e fillInStackTrace() é native .

Sua melhor aposta é fazer cache das chamadas para getMethod() em um local central: basta criar um mapa de dois níveis: Map> e usar uma pesquisa rápida sem qualquer exceção ao jogar.

Meus dois pontos seguintes não resolvem exatamente o título da sua pergunta, mas eu acho que eles podem ser úteis …


Eu confirmo sua medida de desempenho.

Eu li sobre uma solução em um livro de desempenho de java. Aplicamos isso ao nosso próprio aplicativo, para algumas exceções (em que o rastreamento de pilha não é importante e a frequência possível é alta). Eu não sei se você vai gostar … 😉

Crie uma instância exclusiva da sua class Exception, armazene-a. Jogue essa instância .

Isso parece ideal quando você não quer perturbar um stream existente que depende de exceções.


Se o seu compilador reclamar sobre o outro método não lançar essa exceção, é porque você escolheu uma Exceção marcada.
Use uma subclass de RuntimeException (eles estão desmarcados, então o compilador não sabe se eles são lançados ou não, ele não vai reclamar).