Я не знаю, почему не был предложен другой очевидный выбор, но я бы рассмотрел другой подход, где вы просто определяете интерфейсы и используете библиотеку, которая реализует указанные сеттеры, геттеры и необходимые внутренние поля.
Таким образом, вы бы указали что-то вроде
открытый интерфейс Bean {
public int getX ();
public void setX (int value);
}
и попросить библиотеку создать экземпляр типа для этого (и, возможно, вспомогательные методы для создания экземпляров типа). При необходимости аннотации можно использовать для дальнейшей настройки, если это необходимо, но для be / style style bean это не так.
Это отличается от вашего (2), который не будет работать как есть, если я не пропущу что-то: дело в том, что у вас должны быть методы, доступные во время компиляции. И это то, что решит использование интерфейсов. Генерация кода будет необходима, но может быть автоматизирована.
Я ожидал бы, что такие библиотеки существуют, но если нет, то написание универсальной библиотеки должно быть вполне выполнимым с использованием библиотек для генерации байт-кода (asm, cglib, janino, javassist и т. Д.).
Написание такой библиотеки для простого варианта использования, конечно, тяжело, но использование одного из них, похоже, имеет смысл.
... и вполне возможно, что с помощью IDE будет проще всего решить конкретный случай, каким бы он ни был. : -)