2012-02-15 1 views
9

C#은 내가 가장 익숙한 언어이지만 직장에서 Java를 사용합니다. Visual Studio IDE를 사용하는 것이 매우 편하다고 말할 수 있습니다. 디버거에 대한 즐거움 중 하나는 에 대한 시계 변수 (Eclipse의 "Expressions")를 모두 표현식에 넣을 수 있다는 것입니다. 그래서 디버깅 할 때 문제가없는 public이나 public이 아닌 특정 필드의 값, 메소드 호출 등을 들여다 볼 수 있습니다.디버깅 할 때 IDE에서 직접 다른 개체의 비공개 필드를 볼 수 있습니까?

Eclipse에서 동일한 작업을 수행 할 수있는 것 같지 않습니다. 필드에 관련된 getter 메서드를 호출하는 데 의존해야합니다 (필드가 있다고 가정). 그것이 없으면 일시적으로 하나 추가해야만 볼 수 있고, 끝나면 그냥 제거해야한다는 것을 기억해야합니다.

개인 필드 중 하나에 개체에 대한 감시 식을 넣을 수 있습니까? 또는 나는 그것을 잘못하고 있으며 특별한 표현을 만들어서 그것을보아야 만합니까?
(또는 제가 원하는 정보를 얻기위한 더 나은 방법이?)

예를 들어,

가 나는 HttpServletRequest이 있고 requestURI에 눈을 유지하려는. 요청 변수를 보았을 때 많은 필드가 나열되고 너무 많은 정보 일뿐입니다. 나는 객체의 한가지에만 관심이 있습니다. 그래서 이것을 최소화하기 위해, 그 한가지를 위해 시계 표현식을 추가하고 싶습니다.

필드 이름은 분명히 requestURI이므로 표현식을 추가하면 request.requestURI입니다. 이클립스는 필드가 아니라는 오류를 던집니다. 직접 현장으로가는 대신 getter : request.getRequestURI()으로 가야했습니다. 하지만 항상 getter를 사용할 수있는 것은 아닙니다.

the variables view
변수는 디버깅하는 동안, 당신은 변수를 마우스 오른쪽 버튼으로 클릭하고 시계 메뉴 항목을 클릭하면 이클립스에서

the expressions view
식보기

+1

물론, 당신은 ... IDE의 넷빈즈/이클립스/IntelliJ에의에 –

+1

+1 순수을 그렇게 할 수) – berry120

답변

7

Eclipse는 Actual Type이 아닌 Declared Type의 개인/보호 필드를 고려하여 표현식을 평가합니다.

예 :

Number n1 = new Integer(1000); 
Integer n2 = new Integer(1000); 

표현식 :

n1.value can't be evaluate 
n2.value returns 1000, perfectly 

대안은 DetailFormatter가 (변수> 새 세부 사항 포맷터를 마우스 오른쪽 버튼으로 클릭)를 사용합니다.

Eclipse는 유형 객체의 텍스트 표현이 표시 될 때 (예 : 변수보기) toString() 메소드 대신이 표현식을 사용합니다.

당신이 될 수 DetailFormatter ( ApplicationHttpRequest에 대한) :

requestURI 

또는

"URI: " + requestURI + "\n" + 
"Path: " + servletPath 
+0

통찰력에 대해 흥미로운 점은 감사합니다. 그것은 너무 나쁘지 만 이것을 알아내는 것은 충분히 똑똑하지 않습니다. 그들은 확실히 할 수 있어야했습니다. –

+0

나는이 대답이 상황을 가장 잘 설명한다고 생각한다. 캐스트가 도움이되는지 확인하지만, 왜 이렇게 좋은지 설명합니다. –

+0

이 답변은 정확하지만 작동 시키려면 DetailFormatter가 필요하지 않습니다. 원하는 필드가 선언 된 유형이 아닌 경우 객체를 실제 유형으로 캐스트 한 다음 필드를 가져옵니다. 하지만이 작업을 수행해야하는 레이어가 여러 개있는 경우 제대로 작동하지 않습니다. – Tim

0

를 볼 수 있습니다. 디버그 퍼스펙티브에는보고있는 변수 목록이있는 표현식 탭이 추가됩니다. 나는 다른 IDE에서 어떻게하는지 잘 모르겠습니다.

+0

그래, 그게 문제는 아니지만 ... 변수의 비공개 필드를보고 싶다 ... 이클립스는 분명히 그것을 할 수 없다. –

5

필드가 private 또는 protected이면 상관 없습니다. 식 표현식이 올바르게 평가됩니다. 그러나 변수의 범위는 중요합니다.

내가 틀렸다면 나를 수정하십시오.

requestURI은 HttpServletRequest를 구현하는 org.apache.catalina.core.ApplicationHttpRequest의 보호 된 필드입니다. 귀하의 경우 변수 request은 HttpServletRequest 유형이고 HttpServletRequest.requestURI에 액세스하려고 시도하고이 필드가 존재하지 않으므로 Eclipse가 실패합니다. 나는 그것이 정상이라고 생각한다. 적절한 캐스팅을하면 표현이 올바르게 평가됩니다.

+0

요청 객체의 타입은 실제로'org.apache.catalina.connector.RequestFacade'입니다. 그러나 그때조차도 그것을 주조하는 것은 여전히 ​​효과가 없습니다. (이 "문제를 해결하는 _ugly_ 방법"이 될 것입니다) –

+0

사실, 나는 티토가 유형에 대해 옳다고 생각합니다. 변수보기의 2 열은 '값'열입니다. 맞습니까? 내가 아는 한, 해당 열은 구체적인 유형을 표시하며 RequestFacade가 아닌 ApplicationHttpRequest를 표시합니다. – sharakan

+0

아, 미안 해요, 내 첫 코멘트를 무시하십시오. 내 현재 상황은 요청 객체에'RequestFacade' (struts 액션 내)가 있습니다. 내 스크린 샷 (서블릿 내)이 같지 않다는 것을 깨닫지 못했습니다. 나는 기회가있을 때 이것을 재평가해야 할 것이다. –

1

표현식보기에 표현식을 쓰는 것은 마치 코드 행을 작성한 것처럼 평가하고 현재 강조 표시된 행보다 먼저 실행합니다.클래스 액세서 표시 여부 제한을 무시하고 현재 스택 프레임에서 볼 수 없었던 개인, 보호 및 기본 멤버를 볼 수 있다는 점에서 내가 아는 한 가지 차이점이 있습니다.

그 표현에는 올바른 종류의 참조가 필요합니다. 이 줄을 코드에 삽입하면 Java 컴파일러는 requestURI가 HttpServletRequest의 필드가 아니라고 불평합니다. 따라서 실제로 ApplicationHttpRequest 필드를 선언하는 클래스 (또는 하위 클래스)로 형변환해야합니다.

이제 왜 표현식에서 선언 된 유형이 표시되지 않더라도 명시 적 클래스의 모든 멤버를 나열하는 변수 에서처럼 표현식에서 동일한 마법을 노출하는 것을 방해하지 않은 이유는 무엇입니까? 말.

관련 문제