Если надо присвоить значение private
полю из другого класса, то для этого надо писать public
геттерры/сеттеры или конструктор инициализатор.
Если таковых нет, то изменить значение поля со стороны нельзя, за исключением если использовать Reflection API.
Это не отменяет инкапсуляцию, поскольку с помощью рефлексии можно отменить/применить ограничения Java, но это используется для внутреннего инженеринга.
Программист всегда может отменить/запретить рефлексию, поскольку она не является нормальным способом написания програм.
...способ обхода одного из основных принципов ООП
Нет, Reflection API не меняет цель инкапсуляции данных. Цель инкапсуляции данных остается прежней... даже если кто-то умышленно нарушает ее.
Reflection API можно применить где угодно, наиболее часто используется при написании тестов, когда требуется снять ограничения инкапсуляции для доступа к private
полю.
Потому, что код написан скажем другим программистом, и нет другого способа изменить поведение программы, а также покрытие.
Но это не значит, что код из тестов можно использовать для реализации рабочей программы.