2013-06-08 3 views
3

많은 수업이있는 거대한 프로젝트가 있습니다. 나는 매우 특정한 클래스를 가졌다. 그것을 SuperFoo이라고 부르 자. 나는 Superfoo 타입의 인자를 가진 equals() 메쏘드에 대한 모든 호출을 찾아야한다. 희망은 분명하다.자바 클래스에서 메서드 호출을 모두 찾으십시오.

그럼, 한 번 더 ... 수천 개의 자바 파일 (또는 바이트 코드)에서 java.lang.Object.equals(Object arg) 메서드에 대한 모든 호출을 찾고 싶지만이 호출의 인수는 SuperFoo이어야합니다. 예를 들어 :

public void doItWith(SuperFoo foo) { 
    if (otherFoo.equals(foo)){ 
     // do something 
    } 
... 
} 

나는 이클립스와이 작품의 내 의견 없음에 바이트 코드 그냥 자바 검색을 분석, 검색 별 쿼리를 체크 아웃.

+0

http://depfind.sourceforge.net/Manual.html이 도움이 될 수 있습니다. – Jayan

+2

신속하고 더러운 대답; 메소드 서명을 변경하고 IDE가 모든 오류를 표시하는 것을보십시오. –

+0

@GilbertLeBlanc 작동하지 않습니다. 컴파일러는 Object.equals를 대신 호출 할 것입니다. – seteropere

답변

1

프로그래밍 방식은 Aspect Oriented Programming (즉, AspectJ)을 사용하는 것입니다. 당신은 관심

pointcut equals(Superfoo o) = call(boolean *.equals(Object)) && args(o); 

의 메소드 호출을 캡처하는 포인트 컷을 정의하고 각 발생을 선택하고 코드에서 나타나는 정적 정보 즉를 얻기 위해 joinpoint를 개체를 쿼리 조언을 사용할 수 있습니다.

before(Superfoo o) : equals(o) { 
    System.out.println("An occurence at "+thisJoinPoint.getSourceLocation()); 
} 
+0

컴파일 타임 짜기를 사용하면 런타임 전에 모든 조인 포인트를 찾을 수 있습니까? –

+2

아마도 더 좋은 방법 일 겁니다.하지만 이클립스에서 AspectJ를 사용하면 조인 포인트와 일치하는 모든 장소를 물어볼 수 있습니다. – selig

+0

나는 그것을 체크 아웃하고이 pointcut은 'equals'메소드에 대한 모든 호출과 일치합니다 (SuperFoo 유형의 인수뿐만 아니라) :(모든 아이디어? – tomekkup

0

그래서, 당신은 SuperFoo에서 재정의

public boolean equals(Object o) 

의 참고 문헌을 찾기 위해 노력하고 있습니다. 소스 코드에 액세스 할 수 있으면 이클립스에서 수행 할 수 있습니다. Call Hierarchy로 이동하면 eclipse는 Object의 equals() 메서드가 모든 발생을 반환합니다. 따라서 다음을 시도하십시오.

열기 SuperFoor. equals 메서드를 선택합니다. 마우스 오른쪽 버튼으로 클릭. 참조 -> 프로젝트. 최종 검색 창에서 가장 오른쪽에있는 삼각형을 클릭하십시오. "대체 할 참조"를 선택하십시오. 그게 전부 야. 처음에 반환 된 결과는 필터링되고 대부분은에 SuperFoo에서 덮어 쓰여진 equals 참조가 포함됩니다.

희망이 도움이됩니다.

관련 문제