Как стать автором
Обновить

Комментарии 11

Спасибо, дополнил статью

Вопрос в том, как от него теперь отпочковаться?

Вопрос хороший и не совсем тривиальный :)

Кодогенерация приводит нас к необходимости создания скрипта на питоне плагина для конкретного сборщика, а это последняя вещь, к которой вообще следует обращаться (что, если потенциальный пользователь нашей библиотеки использует другой сборщик?

Можно написать плагин для компилятора.

Действительно, вы правы, про это я как-то забыл.

А если генерировать новый класс как nested класс для класса к которому пытаемся получить доступ? Вроде nested классам позволено читать private и package-private поля.

Не пройдёт - nested классы, чтобы считаться таковыми, должны входить в объявление родителя. Решения вроде задать классу имя Parent$Class очевидно не работают.

Можно воспользоваться java agent'ом, чтобы ловить момент первой загрузки класса, тобишь линковку, и подменять в нём нужные модификаторы на паблик (или вписать nested-классы).

В jeflect'е было реализована эта фича, но позже убрана, потому что работала не для всех классов (момент линковки "системных" классов перехватить изнутри невозможно) и плюс не все jvm разрешают работать с агентом полноценно.

Другим прикольным способом обойти проверки доступа будет загрузка dll, хукающую кишки машины, и изменение таким образом слинкованной информации, но тут тоже много подводных камней - можно что-то поломать, узнав об этом через несколько часов по падению прода с сегфолтом, и решение получается платформозависимым.

В целом обходов много, но универсальные вряд ли есть + подобный функционал нужен еще реже, чем прокси-генераторы.

Все же хотелось видеть в выводах заключение в цифрах сравнение, ибо я часто статьи читаю так:

Читаешь введение о чем статья, потом смотришь заключение и цифры и если интересно то читаешь полностью, поэтому советую все же дополнить вывод тем о чем говорилось в ведении и на вопрос что лучше использовать когда можно заменить то или иное есть ли еще способы и в цифрах второй метод первым, и когда рефлексию не заменить вашим способом

Хорошее замечание, дополню

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории