문제

나는 우리가 도서관의 양을 결정하고 싶은 도서관에서 일하고 있습니다. 즉, 우리는 도서관의 방법이 공개되었지만 결코 호출되지 않은 방법을 알고 싶습니다.

목표 : 정적 분석 현재 프로젝트에서 패키지 A의 각 공개 메소드를 호출하는 코드 라인의 수를 결정합니다. 통화 수가 0 인 경우 방법을보고해야합니다.

도움이 되었습니까?

해결책

나는 당신 이이 일식 플러그인을 찾고 있다고 믿습니다 -> ucdetector

문서에서 (두 번째 총알 포인트에 대한 지불 통지)

  • 불필요한 (죽은) 코드
  • 가시성이 보호, 기본 또는 개인으로 변경 될 수있는 코드
  • 최종적 일 수있는 필드의 방법

더 큰 규모로 객체 수준 정적 분석을 수행하려면 IBM 에서이 도구를보십시오 ->Java의 구조 분석. 라이브러리, API 등의 객체 분석에 정말 도움이됩니다.

다른 팁

정확히 당신이 찾고있는 것이 아니라 :

코드 커버리지 도구와 비슷한 일 (예 : 코베르 투라). 소스 코드를 정적으로 검사하지는 않지만 바이트 코드를 사용하여 런타임에 메트릭을 수집합니다. 물론, 모든 사용 패턴을 연습하는 방식으로 애플리케이션을 구동해야하며 더 희귀 한 코드 경로를 놓칠 수 있습니다.

정적 분석 전면에서, 이러한 도구는 아마도 당신을 도울 수 있습니다 (Apache 프로젝트는 새로운 릴리스에 대한 API 호환성을 확인하는 데 사용하여 작업이 수행하려는 작업과 다소 관련이있는 것 같습니다).

  • Clirr Java 라이브러리에서 이진 및 구형 릴리스와의 소스 호환성을 확인하는 도구입니다. 기본적으로 두 세트의 JAR 파일 세트를 제공하고 Clirr는 공개 API의 변경 목록을 덤프합니다.
  • Jdiff 두 개의 API를 비교할 때 문서를 포함하여 어떤 방식 으로든 제거, 추가 또는 변경된 모든 패키지, 클래스, 생성자, 방법 및 필드에 대한 HTML 보고서를 생성하는 Javadoc Doclet입니다.

반사 호출의 클라이언트 사용은 고려해야 할 정적 분석에서 하나의 구멍입니다. 기괴한 반사 체계를 통해 특정 방법이 호출되지 않는다는 것을 알 수있는 방법이 없습니다. 따라서 런타임과 정적 분석의 조합이 가장 좋을 수 있습니다.

나는 당신이 클래스 나 함수가 얼마나 "종종"필요한지 측정 할 수 없다고 생각합니다.
간단한 질문이 있습니다.

  • 게임 라이브러리의 사용 통계가 "정상"이거나 "특이한"인 경우 무엇이 정의됩니까? 게임에서 너무 자주 자신을 죽이는 것이 잘못입니까? 당신은 좋은 게이머처럼 "킬 스크린"클래스를 더 자주 사용합니다.
  • "많은"을 정의하는 것은 무엇입니까? 시간 또는 사용량 수? Pojos는 드문 시간을 소비하지만 꽤 자주 사용됩니다.

결론:
나는 당신이 무엇을 성취하려고하는지 모르겠습니다.
코드 종속성을 표시하려면 다른 사람이 있습니다. 도구 이것을 위해. 코드 실행을 측정하려는 경우 프로파일 러 또는 벤치 마크 자바를 위해. 당신이 통계 괴짜라면 당신은 행복 할 것입니다 RapidMiner ;)

행운을 빌어 요!

jdepend가 패키지와 클래스 사이의 종속성을 보여주고, 주기적 종속성을 찾는 것이 좋습니다!http://clarkware.com/software/jdepend.html(이클립스 플러그인이 있습니다. http://andrei.gmxhome.de/jdepend4eclipse/

또한 다른 메트릭에 대한 PMDhttp://pmd.sourceforge.net/

Intellij에는 더 제한된 수정자를 가질 수있는 방법, 필드, 클래스를 감지하는 도구가 있습니다. 또한 이러한 변경 사항을 적용 할 수있는 빠른 수정이있어 많은 작업을 절약 할 수 있습니다. 비용을 지불하고 싶지 않다면 코드를 변경하기에 충분한 시간 이상인 30 일 평가 라이센스를 얻을 수 있습니다. 자주해야 할 일이 아닙니다.

BTW : Intellij는 코드 품질을 향상시키기 위해 약 650 개의 코드 검사를 보유하고 있으며, 약 절반은 자동 수정 사항을 가지고 있으므로 코드를 리팩터링/정리하는 데 하루를 보내는 것이 좋습니다.

살펴보세요 죽은 코드 탐지기. 정적 분석을 사용하여 사용하지 않은 코드 찾기 : 원하는대로 만 수행한다고 주장합니다.

다음은 Java 코드 커버리지 도구의 몇 가지 목록입니다. 나는 이것들을 개인적으로 사용하지 않았지만 시작할 수 있습니다.

Proguard도 옵션 일 수 있습니다 (http://proguard.sourceforge.net/):

"Proguard의 일부 사용은 다음과 같습니다.

  • ...
  • 데드 코드를 나열하므로 소스 코드에서 제거 할 수 있습니다.
  • ... "

또한보십시오 http://proguard.sourceforge.net/manual/examples.html#deadcode

ASM Bytecode Analysis Library를 사용하여 (이 글을 읽은 후 1 시간 이내에) 자신의 유틸리티를 작성할 수 있습니다.http://asm.ow2.org). ClassVisitor와 MethodVisitor를 구현해야합니다. 클래스 리더를 사용하여 라이브러리의 클래스 파일을 구문 분석합니다.

  • 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());
    }
}

즐기다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top