Пожалуйста, обратите внимание: Я не спрашиваю, как заставить все классы переопределить
toString()
в их исходном коде. Пожалуйста, внимательно прочитайте вопрос.Как заставить вызов суперкласса Object.toString реализации(), а не подкласс перекрывая реализации на объекте в Java
Все классы в java расширяют класс Object
. Если какой-либо класс имеет переопределение toString()
, вызов Object.toString()
фактически выполнит метод переопределения.
Например:
String test = "StackOverflow";
Object testobj1 = (Object) test;
System.out.println(testobj1.toString()); // prints "StackOverflow"
Object testobj2 = new Object();
System.out.println(testobj2.toString()); // prints "[email protected]<Object.hashcode() in hex>"
Что мне нужно для вызова testobj1
«s toString()
фактически выполнить toString()
метода, Object
класса. Что-то вроде:
System.out.println([[testobj1 as Object]] .toString()); // prints "[email protected]<Object.hashcode() in hex>"
Я попытался с помощью:
System.out.println(testobj1.getClass().getName() + '@' + Integer.toHexString(testobj1.hashCode()));
Но это также имеет те же проблемы, что и выше. Метод hashCode()
также переоценивается классом String
, поэтому он выполняет String
hashCode()
, а не Object
hashCode()
.
Можно ли вызвать переопределенный метод, а не метод переопределения?
Обратите внимание: Использование
String
класса является лишь примером. Не основывайте свой ответ на предположении, что объект всегда является объектомString
.Также предположит: У меня нет доступа к исходному коду классов, поэтому я не могу просто удалить
toString()
реализации из них или делать вещи, как создать абстрактный класс. Это должно работать для любого объекта (в том числе и собственных классов Java или любого API, напримерString
,HashMap
,HttpServlet
и т. Д.). Это также означает, что я не ищет ответы like these.
достаточно близко! Полностью забыл об этом методе. Это не общее решение, но оно работает для восстановления исходной функциональности 'Object.toString()'! – ADTC
@ADTC - Да, это так .. переопределенные методы динамически отправляются, поэтому я не вижу другого пути здесь. – TheLostMind
Да, но это сработает для меня, поскольку я только хочу реплицировать 'toString()'. Но мне интересно, возможно ли общее решение, используя ** отражение **? * Возможно, слишком много, но возможно ли это? * – ADTC