2011-08-05 14 views
0

내 질문은 자바에서 toString() 메서드를 제공하지 않는 클래스의 특정 정보를 출력 할 수 있습니까?toString()없이 객체 정보를 toString()으로 인쇄 하시겠습니까?

문지르 기 : 특정 인수를 인쇄하는 응용 프로그램 (aspectJ 사용)에 대한 로거를 제공합니다.

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

그리고 우리의 로거 인쇄 다음 예를 들어 우리가 백그라운드에서 JSF와 함께 작업하고 있기 때문에

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

우리는 DataListModel 클래스를 사용해야합니다. 그러나 보시다시피,이 클래스는 toString 메서드를 제공하지 않습니다.

로거는 독자적으로 작성되었으므로이를 적용 할 수 있습니다. 다음과 같이 toString 메서드를 시뮬레이트하는 것이 가능합니까? 클래스가 toString을 제공하지 않으면 해당 필드를 모두 잡아서 인쇄하십시오.

다른 방법이 있습니까?

미리 도움을 주셔서 감사합니다. 인사말, Thunderhook

+0

그것은 DataListModel 클래스를 "소유"누가 명확하지 ...하지만 그것은 당신이'toString' 방법에 자신을 추가 할 수없는 경우, 화면에 구성 할 것 뭔가처럼 들린다. –

답변

6

ReflectionToStringBuilder을 사용할 수 있습니다. 다음과 같이합니다.

if (object.toString().endsWith("@" + Integer.toHexString(object.hashCode())) { 
    // default toString()... 
    return ReflectionToStringBuilder.toString(object); 
} 
else { 
    return object.toString(); 
} 
+0

니스, 나는 이것이 존재한다는 것을 몰랐다. – dfb

+0

이것은 유망한 것처럼 들리 겠지만 월요일에 시도해 보겠습니다! 고맙습니다! – Thunderhook

5

나는 이것을 리플렉션을 사용하여 몇 번했습니다. 본질적으로 dumpObject 인 일반적인 방법을 사용하여 필드를 반복하여 문자열에 넣었습니다. 이것은 훌륭하게 작동하지만 자주 이것을 호출하는 경우 성능을 고려해야합니다. tostring을 하드 코딩하는 것이 좋습니다. 예를 들어,

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

고마워요,이 같은 것이 이미 내 마음에 있었고, 또한 월요일에 시도해 볼 것입니다! – Thunderhook