2009-04-20 6 views
5

현재 라이브러리의 사용량을 확인하려는 라이브러리 작업을하고 있습니다. I.E. 우리 도서관에서 공개적으로 몇 가지 방법이 있지만 결코 호출되지 않는지 알고 싶습니다.Java 코드 사용 검사기

목표 : 정적 분석 현재 프로젝트의 패키지 A에서 각 공용 메서드를 호출하는 코드 줄 수를 결정하십시오. 호출 수가 0이면 메소드를 그와 같이보고해야합니다.

+0

단위 테스트 범위를 사용하는 대신 실행중인 응용 프로그램을 모니터링하는 Cobertura 또는 Emma와 같은 것을 원하십니까? –

답변

9

난 당신이 이클립스 플러그인을 찾고 보라에 대한 PMD : http://clarkware.com/software/JDepend.html 은 (는 Eclipse 플러그인이 있습니다 두 번째 글 머리 부분까지)

  • 불필요한 (죽은) 코드
  • 가시성이이 레벨 정적 분석을 개체 수행하려는 경우, 큰 규모

최종 수 있습니다 보호, 기본 또는 분야의 개인

  • 방법으로 변경 될 수 있습니다
  • 코드, 봐 IBM의이 도구에서 ->Structural Analysis for Java. 라이브러리, API 등의 객체 분석에 유용합니다.

  • 3

    당신이 찾고있는 아니 정확히 :하지만, 비슷한

    뭔가 코드 적용 도구 (예 : Cobertura)로 수행하십시오. 개발자는 소스 코드의 정적 검사를 수행하지 않지만 런타임시 메트릭을 수집하기 위해 바이트 코드를 계측합니다. 물론 모든 사용 패턴을 연습하는 방식으로 응용 프로그램을 구동해야하며 코드 경로가 더 적을 수도 있습니다. (해당 작업은 당신이 뭘 하려는지 다소 관련이 같은 아파치 프로젝트는 새로운 릴리스에 대한 API의 호환성을 확인하기 위해 그들을 사용하는 것)

    정적 분석을 전면에

    , 어쩌면 이러한 도구는 당신을 도울 수 있습니다 :

    • Clirr은 자바 라이브러리에서 이전 버전과의 바이너리 및 소스 호환성을 검사하는 도구입니다. 기본적으로 두 세트의 jar 파일을 제공하고 Clirr는 공개 API의 변경 목록을 덤프합니다.
    • JDiff은 두 개의 API를 비교할 때 문서를 포함하여 어떤 방식 으로든 제거, 추가 또는 변경된 모든 패키지, 클래스, 생성자, 메소드 및 필드의 HTML 보고서를 생성하는 Javadoc 도크 렛입니다.
    1

    "자주"클래스 나 기능이 필요한 방식을 측정 할 수 있다고 생각하지 않습니다.

    게임 라이브러리의 사용 통계는 "정상"이거나 "국외자"경우, 정의 무엇
    • :
      몇 가지 간단한 질문이 있습니다? 게임에서 너무 자주 자살하는 것이 잘못 되었습니까? 좋은 게이머처럼 "killScreen"클래스를 자주 사용하십시오.
    • "많이"무엇을 정의합니까? 시간 또는 사용량 계산? POJO는 드문 시간을 소비하지만 꽤 자주 사용됩니다.

    결론 :
    나는 당신이 성취하려는 것을 모른다.
    코드 종속성을 표시하려면이 작업을 수행하는 다른 tools이 있어야합니다. 코드 실행을 측정하려는 경우 Java 용 profiler or benchmarks이 있습니다. 통계 괴짜 인 경우 RapidMiner;)

    행운을 빈다.

    3

    반사적 호출의 클라이언트 사용은 정적 분석에서 고려해야 할 하나의 구멍입니다. 특정 메서드가 일부 기이 한 리플렉션 체계를 통해 호출되지 않는다는 것을 확실히 알 수있는 방법이 없기 때문입니다. 그래서 아마도 런타임과 정적 분석의 조합이 가장 좋을 수도 있습니다.

    Proguard와 너무 옵션 ( http://proguard.sourceforge.net/) 될 수있다
    0

    당신은 그것을 위해 자신의 유틸리티를 쓸 수 있습니다 참조하십시오. ClassVisitor와 MethodVisitor를 구현해야한다. ClassReader를 사용하여 라이브러리의 클래스 파일을 구문 분석합니다.

    • 각 선언 된 메소드에 대해 ClassVisitor의 visitMethod (..)가 호출됩니다.
    • 호출 된 메소드마다 MethodVisitor의 visitMethodInsn (..)이 호출됩니다.

    계산 유지 보수를 위해지도를 유지 관리하십시오. 키는 메소드를 나타냅니다 (아래 참조). 다음은 몇 가지 코드입니다.

    class MyClassVisitor { 
        // ... 
        public void visit(int version, int access, String name, ...) { 
         this.className = name; 
        } 
        public MethodVisitor visitMethod(int access, String name, String desc, ...): 
         String key = className + "." + name + "#" + desc; 
         if (!map.containsKey() { 
          map.put(key, 0); 
         } 
         return new MyMethodVisitor(map); 
        } 
        // ... 
    } 
    
    void class MyMethodVisitor { 
        // ... 
        public visitMethodInsn(int opcode, String name, String owner, String desc, ...) { 
         String key = owner + "." + name + "#" + desc; 
         if (!map.containsKey() { 
          map.put(key, 0); 
         } 
         map.put(key, map.get(key) + 1); 
        } 
        // ... 
    } 
    

    기본적으로 그게 전부입니다. 다음과 같은 방법으로 쇼를 시작합니다.

    Map<String,Integer> map = new HashMap<String,Integer>(); 
    for (File classFile : my library) { 
        InputStream input = new FileInputStream(classFile); 
        new ClassReader(input).accept(new MyClassVisitor(map), 0); 
        input.close(); 
    } 
    for (Map.Entry<String,Integer> entry : map.entrySet()) { 
        if (entry.getValue() == 0) { 
         System.out.println("Unused method: " + entry.getKey()); 
        } 
    } 
    

    즐기십시오!

    +0

    메서드 A가 메서드 B를 호출하면 메서드 A가 사용되지 않아도 메서드 B가 "사용됨"으로 표시되므로이 메서드를 사용하는 것이 옳지 않습니다. "중고품"에 대해 일시적으로 폐쇄해야합니다. –

    1

    IntelliJ에는 메서드, 필드, 한정자가 더 제한 될 수있는 클래스를 검색하는 도구가 있습니다.또한 이러한 변경 사항을 적용하기위한 빠른 수정을 통해 많은 작업을 절약 할 수 있습니다. 비용을 지불하고 싶지 않으면 30 일간의 평가 라이센스를 얻을 수 있습니다.이 라이센스는 코드를 변경할 수있는 충분한 시간입니다. 자주해야 할 일이 아닙니다.

    BTW : IntelliJ는 코드 품질을 향상시키기 위해 약 650 개의 코드 검사를 실시하고 있으며, 약 절반에 자동 수정 기능이 있으므로이 코드를 사용하여 코드를 리팩터링하거나 정리하는 데 몇 일을 소비하는 것이 좋습니다.

    1

    Dead Code Detector을 참조하십시오. 정적 분석을 사용하여 사용하지 않는 코드를 찾으십시오.