Комментарии 11
Если все упирается в скорость проще взять MagicAccessor
https://habr.com/ru/articles/132703/
Кодогенерация приводит нас к необходимости создания
скрипта на питонеплагина для конкретного сборщика, а это последняя вещь, к которой вообще следует обращаться (что, если потенциальный пользователь нашей библиотеки использует другой сборщик?
Можно написать плагин для компилятора.
А если генерировать новый класс как nested класс для класса к которому пытаемся получить доступ? Вроде nested классам позволено читать private и package-private поля.
Не пройдёт - nested классы, чтобы считаться таковыми, должны входить в объявление родителя. Решения вроде задать классу имя Parent$Class очевидно не работают.
Можно воспользоваться java agent'ом, чтобы ловить момент первой загрузки класса, тобишь линковку, и подменять в нём нужные модификаторы на паблик (или вписать nested-классы).
В jeflect'е было реализована эта фича, но позже убрана, потому что работала не для всех классов (момент линковки "системных" классов перехватить изнутри невозможно) и плюс не все jvm разрешают работать с агентом полноценно.
Другим прикольным способом обойти проверки доступа будет загрузка dll, хукающую кишки машины, и изменение таким образом слинкованной информации, но тут тоже много подводных камней - можно что-то поломать, узнав об этом через несколько часов по падению прода с сегфолтом, и решение получается платформозависимым.
В целом обходов много, но универсальные вряд ли есть + подобный функционал нужен еще реже, чем прокси-генераторы.
Все же хотелось видеть в выводах заключение в цифрах сравнение, ибо я часто статьи читаю так:
Читаешь введение о чем статья, потом смотришь заключение и цифры и если интересно то читаешь полностью, поэтому советую все же дополнить вывод тем о чем говорилось в ведении и на вопрос что лучше использовать когда можно заменить то или иное есть ли еще способы и в цифрах второй метод первым, и когда рефлексию не заменить вашим способом
Ускоряем java-рефлексию в 2023