Поскольку вы хотите разместить возможные новые поля, карта будет более полезной для вас, чем класс.
Иллюстрируя, используя ваш пример, вместо этого:
Person person = getPersonFromSomewhere();
System.out.printf("%s was %d years old\n", person.name, person.age);
person.age++; // happy birthday!
... вы бы сделали это:
Map<String, Object> person = getPersonFromSomewhere();
System.out.printf("%s was %d years old\n", person.get("name"), person.get("age"));
int currentAge = (Integer) person.get("age"); // real code would sanitise the value first
person.put("age", currentAge + 1); // happy birthday!
Да, это означает больше кода и меньше проверки на ошибки (компилятор не скажет вам, если вы неправильно написали 'name', и нет проверки типов), но он будет делать то, что вы хотите. И, учитывая, что передовой практикой является кодирование получателей и установщиков, а не прямой доступ к полям членов, в реальной жизни вы все равно будете писать больше кода.
Если вы решите пойти по этому пути, обратитесь к к этому вопросу , чтобы узнать, как конвертировать в / из XML.