2010-05-13 6 views
3

코드에서 사용되는 API와 정확히 어떤 메소드가 호출되는지에 대한 보고서를 제공해야합니다. Windows DLL의 경우 "dumpbin/imports"를 사용합니다. - Java .class 파일에 해당하는 것이 있습니까?Java 클래스에서 사용하는 메소드를 결정하는 방법

javap이보기에는 분명하지만, 나는 내가하고있는 일을하는 것처럼 보이는 옵션을 찾을 수 없습니다.

+0

무엇을 정확하게 당신이 찾고 : 하는 - 3 어떤 자 패키지/클래스/메소드는 사용을 당신의 코드로? - 데드 코드를 찾기 위해 어떤 방법을 사용하지 않습니까? 또한 리플렉션을 사용하면 이러한 분석이 완전하지 않을 수 있습니다. 가장 간단한 경우에는 * .java 파일의 모든 import 문에 대해 grep을 찾고있을 수도 있습니다 ... –

+0

코드에서 사용하는 타사 패키지/클래스/메소드는 무엇입니까? 특히 우리는 .jar를 고객에게 전달하고 있으며, 고객은 자신이 호출하는 메소드를 정확히 알고 싶어합니다. import 문을 grepping하는 것은 우리가 사용하는 패키지를 알려주지 만, 모든 단일 메소드의 목록을 원합니다. (묻기 전에, 왜 그런지 모르겠습니다.) –

+0

고객을 확신시키려는 경우에 대비하여 어떤 라이브러리가 다른 라이브러리를 호출하면 어떻게됩니까? 또는 (라이브러리 메소드를 호출하는) 자신의 메소드가 호출되지 않는다면 어떻게 될까요? – Arjan

답변

2

javap -c class1 class2 ... | grep invoke

당신은 모든 런타임 호출을 받게됩니다. API에서 필터를 필터링하면 가져온 메소드에 대한 호출이 제공됩니다.

또한 사용 가져 오기 필드를 확인 할 수 있습니다

:

는 는

javap -c class1 class2 ... | grep getstatic는 (검색도 putstatic, putfield, getfield)

+0

감사! 몇 가지 방법이 있어야한다는 것을 알았습니다 :-) –

0

아파치/메이븐 어때 jxr 어때?

+0

필자는 jxr을 사용하지는 않았지만, 문서에서 볼 수있는 것으로부터 소스로부터 HTML을 생성하고, 호출 된 타사 메소드에 대해서는 언급하지 않습니다 (위의 주석 참조)? –

+0

API로 사용합니다. 당신은 그것을 부를 수 있습니다. – bmargulies

1

그것은 잔인하지만이 같은 시도 할 수 :

  1. 이/ 패키지 XY부터입니다 정적 클래스 Z {}와 "수입 XYZ"에 대한 코드에서 글로벌 검색을 교체하는 당신의 타사

  2. 단지 당신의 컴파일 스크립트를 실행 (또는 IDE 가능한 경우에서 오류를 복사) 을 찾고

  3. 프로세스 컴파일 오류 "The method xxx is undefined"유형의 메시지

+0

변수가 메서드와 같은 이름을 지정하면 앞에서 설명한 메서드가 잘못된 결과를 반환 할 수 있지만 여기에 설명 된 메서드는 이러한 단점을 갖지 않습니다. 이 작업을 수행하기 위해 perl/python/ruby ​​/ sed 스크립트를 작성하면 이것이 잔인하다고 생각하지 않습니다. +1 올바른 솔루션입니다. –

+0

제안에 감사드립니다. Windows에서의 dumpbin/export 나 Linux에서의 nm -u와 비슷합니다. 아아, 한숨, 그런 삶. 다시 한번 감사드립니다. –

0

나는이 작업을 수행하는 특정 도구를 모르겠지만, 당신이 단지 또는 소스가있는 경우는, 펄 스크립트를 사용하여 적당한 어려움을 함께 할 수있는 날 것으로 보인다 .

당신은 소스를 생성하는 JAD http://en.wikipedia.org/wiki/JAD_(JAva_Decompiler)를 통해 항아리를 실행할 수 있습니다, 다음 펄 스크립트를 작성한다 : 소스

를 각각의 파일을 통해

  1. 검색합니다. 발견

    B 가져온 패키지를

    C 일치하는 디 컴파일 타사 소스의 모든 소스 파일을 찾아 모두 수입 등록 표현 문자열. 제 3 자의 각 파일에 대해 메소드 이름을 추출하십시오.

    d. 일치하는 경우 + class + 패키지 메소드를 저장하십시오.

물론 이것은 훨씬 효율적으로 만들 수 있습니다. 모든 패키지의 해시 테이블을 만들 수 있으며 그 안에 제 3 자의 모든 메소드에 대한 해시 테이블을 만들 수 있습니다.

일단 방법을 사용하면 다시 찾을 필요가 없으므로 테이블에서 삭제할 수 있습니다.

그러나 이것은 계산적으로 집중적 인 문제가 아니기 때문에 아마 무차별 대입 방식으로도 충분합니다 (물론 인간에게는 매우 노동 집약적 일 것입니다).

당신이 선호하는 경우 루비/파이썬/PHP/sed/awk를 perl로 대체하십시오. 당신은 파워와 유연성을 많이합니다

0

, 나는 확실히 분석하고 자바 바이트 코드 조작을위한 훌륭한 도구의 많은 기본적으로있는 ASM library

을 살펴 것입니다.가장 유용한 도구 중 하나는 모든 클래스의 내부를 거쳐 원하는 분석을 수행 할 수있는 vistor 기반 API입니다 (사용자의 경우 다른 클래스/패키지가 참조되는 것을 감지 할 수 있음).

관련 문제