java
March 2

Как заменить setAccessible(true) для приватных полей на PropertyDescriptor

Многие разработчики используют рефлексию (setAccessible(true)) для изменения приватных полей, но начиная с Java 9 это уже не так просто. Доступ к setAccessible(true) ограничен модульной системой, а с каждым новым релизом Java эта лазейка становится сложнее. Да и ломать инкапсуляцию — это очень плохая идея.

Поэтому мы будем использовать...

PropertyDescriptor

PropertyDescriptor из пакета java.beans позволяет получить метод set для поля и безопасно вызывать его, не ломая рефлексию.

Давай разберем на примере. Вот так делать НЕ надо:

А теперь через PropertyDescriptor

Почему лучше использовать PropertyDescriptor?

Не нарушает инкапсуляцию использует публичный сеттер вместо вмешательства в приватные поля.

Совместимо с модульной системой Java – не требует setAccessible(true), который ограничен в новых версиях.

Безопасно для будущих обновлений – код продолжит работать даже после изменений в рефлексии.

Еще больше статей на канале для Java разработчиков и тимлидов https://t.me/madteamleadchannel