Вариант 1 - действительно плохая идея, потому что он налагает ограничение «является» на ваши реализации без веской причины, и каждый из ваших классов должен наследовать от одного и того же базового класса.Это маловероятно, даже возможно.
Вариант 2 также является плохой идеей - вам придется повторять один и тот же код в каждый класс - кошмар обслуживания и без добавления значения.
Лучшим вариантом является использование служебного класса:
public class MyUtils {
public static String toString(Object object) {
// your reflection impl here
}
}
public class MyClass {
...
public String toString() {
return MyUtils.toString(this);
}
}