Вывести информацию об объекте как toString () без toString ()? - PullRequest
0 голосов
/ 05 августа 2011

мой вопрос: можно ли распечатать конкретную информацию из класса, который не предоставляет метод toString () в JAVA?

В этом есть одна проблема: мы предоставляем регистратор для нашего приложения (используя aspectJ), которыйраспечатывает конкретные аргументы, которые были даны.Например:

public void addGroupMembers(Group group, String doneBy, DataListModel<User> users) {
    doSomething()
}

И наш Logger печатает следующее:

addGroupMembers called with given arguments:
Group = [id = ..... and so on]
username
DataListModel$1231 <-

Мы должны использовать DataListModel-Class, потому что мы работаем с JSF в фоновом режиме.Но, как вы можете видеть, этот класс не предоставляет метод toString.

Наш регистратор написан сам, поэтому мы можем это адаптировать.Можно ли имитировать метод toString, например: если класс не предоставляет toString, перехватывает все их поля и печатает их?

Или есть какой-либо другой способ?

Спасибо взаранее за вашу помощь.Привет, Грозовой крюк

Ответы [ 2 ]

7 голосов
/ 05 августа 2011

Вы можете использовать ReflectionToStringBuilder .Что-то вроде:

if (object.toString().endsWith("@" + Integer.toHexString(object.hashCode())) {
  // default toString()...
  return ReflectionToStringBuilder.toString(object);
}
else {
  return object.toString();
}
6 голосов
/ 05 августа 2011

Я делал это несколько раз, используя отражение. У меня был общий метод, который по сути был dumpObject, который перебирал поля и помещал их в строку. Это прекрасно работает, но не забывайте учитывать производительность, если вы часто это вызываете - может быть, лучше жестко закодировать tostring. например.,

    for (Field field : obj.getClass().getDeclaredFields()) {
        field.setAccessible(true); 
        log.info(field.getName()
                 + " - " + field.getType()
                 + " - " + field.get(obj));
    }
...