Если я использую отражение и хочу узнать, реализован ли метод или нет, я могу использовать метод getMethod (). Этот метод вызывает исключение NoSuchMethodException.

Есть ли способ перегрузить fillInStackTrace этого исключения для оптимизации производительности? Сейчас около 40% времени тратится на этот метод.

Я использую фреймворк, использующий исключения как способ выполнения определенного типа потока управления.

Так что я не хочу быть слишком агрессивным. Если я создаю класс, расширяющий Throwable и использую этот новый класс вместо NoSuchMethodException, у меня получается что-то вроде:

NewException is never thrown in body of corresponding trystatement

Благодарность

1
LB40 5 Окт 2009 в 19:43

2 ответа

Лучший ответ

Нет, поскольку getMethod() вызывает new напрямую, и вы не можете заменить код для NoSuchMethodException, поскольку класс подписан, а fillInStackTrace() равен native.

Лучше всего кэшировать вызовы к getMethod() в центральном месте: просто создайте двухуровневую карту: Map<Class, Map<String, Method>> и используйте быстрый поиск без каких-либо исключений.

1
Aaron Digulla 5 Окт 2009 в 19:52
Но если у меня много классов, карта будет огромной. Придется кардинально поменять рамки. жесткий...
 – 
LB40
5 Окт 2009 в 20:36
Итак, я обнаружил, что вызов getMethods и перебор массива кажутся более быстрыми. Спасибо за помощь. Таким образом я смог обернуть вызов getMethod.
 – 
LB40
5 Окт 2009 в 22:20

Мои два следующих пункта не совсем соответствуют названию вашего вопроса, но я думаю, что они могут быть полезны ...


Подтверждаю вашу оценку эффективности.

Я читал о решении в книге производительности Java. Мы применили это к нашему собственному приложению для некоторых исключений (где трассировка стека не важна и возможная частота высока). Не знаю, понравится ли вам ... ;-)

Создайте уникальный экземпляр вашего класса Exception, сохраните его. Бросьте этот экземпляр .

Это кажется идеальным, если вы не хотите нарушать существующий поток, который полагается на исключения.


Если ваш компилятор жалуется на то, что другой метод не генерирует это исключение, это потому, что вы выбрали отмеченное исключение.
Используйте подкласс RuntimeException (они не отмечены, поэтому компилятор не знает, выброшены они или нет, он не будет жаловаться).

1
KLE 5 Окт 2009 в 19:53
Что касается первого решения, я не могу этого сделать, так как я не генерирую исключение. Я думаю, что мое первое решение было довольно глупым, так как я допустил ошибку, запутав метание и отлов, даже если я поймаю собственное исключение, что не означает, что это было выброшено ..
 – 
LB40
5 Окт 2009 в 20:30