2017-01-23 3 views
1

У меня такая же проблема, на что ответили в этом сообщении How do I print my Java object without getting "[email protected]"? Я пытаюсь распечатать PutObjectRequest в журналах, который является ссылочным значением объекта объекта. Но я не могу добавить метод toString(), поскольку я использую предопределенный класс (PutObjectRequest) от AWS. Есть ли способ распечатать какие значения в этом объекте?Как печатать предопределенные java-объекты?

log.info("Sending request: {}", request); 
+1

Не совсем. Если у создателей этого класса не было предусмотрительности, чтобы включить надлежащий метод 'toString()', вы вроде бы boned. Вы можете просмотреть каждый тип объекта в списке и выбрать подходящий симпатичный принтер (который вам нужно написать), но это довольно трудоемкая вещь для реализации. – markspace

+0

Тип может быть легко сериализован в формате JSON; если это так, то некоторый (полезный или не) текст может быть относительно легко вынимаемым. YMMV и здесь есть другие потенциальные проблемы, в зависимости от графа объектов. Сериализация JSON сама использует отражение, которое/может/выполняться вручную. – user2864740

+0

Или вы могли бы просто ткнуть в него с отражением, я думаю. Кроме того, утомительно, но вы можете написать один метод, который делает разумную работу по печати всех объектов в вашей системе без 'toString()'. – markspace

ответ

2

Есть ли способ печати, какие значения происходит в этом объекте?

Вам необходимо написать собственный метод для извлечения соответствующих компонентов объектов запроса (используя общедоступные геттеры), соответствующим образом отформатировать их и вернуть лот в виде строки. Затем вызовите этот метод на объекте request и передайте результирующую строку в регистратор вместо объекта request.

Если вам нужно вникать в личное состояние (используя абстрагирующее отражение), это сложнее, и вы рискуете потерять свой код, если меняются детали реализации класса запроса.

Tedious. Но нет общего решения, AFAIK.

(Если вы используете общую схему сериализации, вы несете ответственность, чтобы работать с проблемой, что некоторые из компонентов являются либо не связаны, или ни сериализации, или огромным ...)


UPDATE - на самом деле, было бы целесообразно использовать специальный метод, как это:

if (log.isInfoEnabled()) { 
    log.info("Sending request: {}", myFormat(request)); 
} 

Если вы не охраняют info(...) вызов, накладные расходы форматирования будут понесены, независимо от уровня Логгина.

Смежные вопросы