Отражение Java вызывает много тех же проблем, которые возникают у динамически типизированных языков, таких как Python и Ruby. Фактически, один из способов думать о динамически типизированных языках - это то, что все вызывается с использованием отражения, а языки просто обеспечивают хороший, чистый синтаксис для отражения.
И да, с динамически типизированными языками (или интенсивным использованием рефлексии) рефакторинг труден. Вы не получите хороших возможностей рефакторинга Eclipse. Вместо этого grep становится вашим другом.
По моему опыту, лучшее, что вы можете сделать, - это создать себе хорошую сеть безопасности для юнит-тестов. Таким образом, если вы нарушите динамический код во время рефакторинга, по крайней мере, вы поймете его быстро, когда будете запускать тесты.
Если вы делаете много статически типизированного кода, у вас большие проблемы, если у вас нет хорошей базы модульных тестов. Если вы делаете много динамически типизированного кода (включая код с большим количеством размышлений), у вас нет надежды на успех без хорошей базы модульных тестов.