2010-02-24 4 views
7

일부 Java 디버깅을 위해 IntelliJ IDEA 8을 사용하고 있지만이 질문은 모든 Java 디버거에 적용되었을 수 있습니다. 변수의 목록에서, 그들은 표시 등 :디버깅 중에 변수 정보를 해독

인 myVariable = {[email protected]}

내가 클래스 이름 뒤에 오는 숫자에 대해 궁금합니다. 번호는 정확히 무엇입니까? 참조되는 동일한 기본 객체 인 경우 두 개의 변수가 동일한 수를 갖겠습니까?

미리 감사드립니다.

답변

10

즉, 개체 ID는이고 자세한 내용은 JDWP specification을 참조하십시오.

대상 VM에서 개체를 고유하게 식별합니다. 특정 객체는 JDWP 명령에서 정확히 하나의 objectID로 식별되고 전체 수명 (또는 objectID가 이 명시 적으로 처리 될 때까지)으로 응답하는 입니다. Object ID는 오브젝트가 오브젝트가 수집되었는지 여부에 관계없이 명시 적으로 오브젝트를 처리하지 않은 경우 다른 오브젝트를 식별하는 데 다시 사용되지 않으며 입니다. objectID가 0이면 null 개체를 나타냅니다. 개체 ID가 인 경우 개체의 가비지 수집이 금지되지 않습니다. 모든 은 오브젝트 ID 과 함께 수집 된 오브젝트 에 액세스하려고하면 INVALID_OBJECT가 오류 코드가됩니다. 가비지 수집은 을 DisableCollection 명령으로 비활성화 할 수 있지만 일반적으로 이렇게하려면 이 아닙니다.

+0

JDWP objectID는 코드 내에서 액세스 할 수 없으므로 다소 쓸모가 없습니다. 개체의 System.identityCashCode() 훨씬 더 유용 할 것입니다. 그것은 매우 자주 우리가 객체 B에 대한 참조를 포함하고있는 객체 A를 가지고 있고, 객체 A의 toString()에서 객체 B의 식별 해시 코드를 포함 할 수 있습니다. 그런 다음에/watch/etc 변수를 살펴 봅니다. IntelliJ IDEA가 신원 해시 코드로이를보고하지 않았기 때문에 해당 ID 해시 코드로 개체 B를 찾을 수 없습니다. –

+0

로깅에도 동일하게 적용됩니다. 우리는 종종 객체에 대한 참조를 기록합니다. 오브젝트의 인스턴스를 로그하는 쉽고 신뢰성있는 방법 중 하나는 identityHashCode를 로그하는 것입니다. 그러나 다시 IntelliJ IDEA는 로그에 참조가있는 객체가 변수에 나타나는 참조와 같은지 여부를 확인할 수 없도록합니다. 이는 IDHashCode 만 기록 할 수 있기 때문에 IntelliJ IDEA는 JDWP objectID를 표시합니다. –

-3

클래스가 toString을 자체 구현으로 재정의하지 않을 때 생성되는 것처럼 보이는 바로 가기 toString 결과입니다.

그 객체에 대한 Java 문서에 따라 다음, (당신이 toString을 무시하고 다른 출력을 얻을 경우 확인하여 확인하실 수 있습니다) 경우가 있다면 (http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html)는 toString의 기본 구현은 다음과 같습니다

getClass().getName() + '@' + Integer.toHexString(hashCode()) 

Hashcodes - 당신이 말하는 번호는 꽤 까다 롭습니다. 또, 객체에 Java 문서에서, 해시 코드는 다음과 계약 구현됩니다

The general contract of hashCode is: 

* Whenever it is invoked on the same object more than once during an execution of a Java application, the hashCode method must consistently return the same integer, provided no information used in equals comparisons on the object is modified. This integer need not remain consistent from one execution of an application to another execution of the same application. 
* If two objects are equal according to the equals(Object) method, then calling the hashCode method on each of the two objects must produce the same integer result. 
* It is not required that if two objects are unequal according to the equals(java.lang.Object) method, then calling the hashCode method on each of the two objects must produce distinct integer results. However, the programmer should be aware that producing distinct integer results for unequal objects may improve the performance of hashtables. 

그래서, 짧은 대답은, 당신이 숫자는 같은 객체 참조의 의미하지 않는다. 그것들은 동일한 값을 저장할 수 있지만, 그것도 주어지지 않습니다.

+0

이 답변이 정확하지 않습니다. 해시 코드가 아닙니다. – CrazyCoder

+0

그래, 내가 말했듯이 (내가 말했듯이) 그것은 기본 toString 구현처럼 보였다. – MCory

관련 문제