현재 라이브러리의 사용량을 확인하려는 라이브러리 작업을하고 있습니다. I.E. 우리 도서관에서 공개적으로 몇 가지 방법이 있지만 결코 호출되지 않는지 알고 싶습니다.Java 코드 사용 검사기
목표 : 정적 분석 현재 프로젝트의 패키지 A에서 각 공용 메서드를 호출하는 코드 줄 수를 결정하십시오. 호출 수가 0이면 메소드를 그와 같이보고해야합니다.
현재 라이브러리의 사용량을 확인하려는 라이브러리 작업을하고 있습니다. I.E. 우리 도서관에서 공개적으로 몇 가지 방법이 있지만 결코 호출되지 않는지 알고 싶습니다.Java 코드 사용 검사기
목표 : 정적 분석 현재 프로젝트의 패키지 A에서 각 공용 메서드를 호출하는 코드 줄 수를 결정하십시오. 호출 수가 0이면 메소드를 그와 같이보고해야합니다.
난 당신이 이클립스 플러그인을 찾고 보라에 대한 PMD : http://clarkware.com/software/JDepend.html 은 (는 Eclipse 플러그인이 있습니다 두 번째 글 머리 부분까지)
최종 수 있습니다 보호, 기본 또는 분야의 개인
다음은 몇 가지 Java 코드 적용 도구 목록입니다. 나는 개인적으로이 중 하나를 사용하지 않은,하지만 얻을 수 있습니다 당신은 시작 :
코드 적용 도구의 문제점은 런타임에 작동하므로 "드문"코드 경로가 누락 될 수 있다는 것입니다. – Thilo
당신이 찾고있는 아니 정확히 :하지만, 비슷한
뭔가 코드 적용 도구 (예 : Cobertura)로 수행하십시오. 개발자는 소스 코드의 정적 검사를 수행하지 않지만 런타임시 메트릭을 수집하기 위해 바이트 코드를 계측합니다. 물론 모든 사용 패턴을 연습하는 방식으로 응용 프로그램을 구동해야하며 코드 경로가 더 적을 수도 있습니다. (해당 작업은 당신이 뭘 하려는지 다소 관련이 같은 아파치 프로젝트는 새로운 릴리스에 대한 API의 호환성을 확인하기 위해 그들을 사용하는 것)
정적 분석을 전면에, 어쩌면 이러한 도구는 당신을 도울 수 있습니다 :
"자주"클래스 나 기능이 필요한 방식을 측정 할 수 있다고 생각하지 않습니다.
게임 라이브러리의 사용 통계는 "정상"이거나 "국외자"경우, 정의 무엇결론 :
나는 당신이 성취하려는 것을 모른다.
코드 종속성을 표시하려면이 작업을 수행하는 다른 tools이 있어야합니다. 코드 실행을 측정하려는 경우 Java 용 profiler or benchmarks이 있습니다. 통계 괴짜 인 경우 RapidMiner;)
행운을 빈다.
JDepend가 패키지와 클래스 간의 종속성을 보여주기를 권합니다. 순환 종속성을 찾기가 좋습니다!- 문서에서>UCDetector
(유료 통지도 http://andrei.gmxhome.de/jdepend4eclipse/
및 기타 측정 http://pmd.sourceforge.net/
반사적 호출의 클라이언트 사용은 정적 분석에서 고려해야 할 하나의 구멍입니다. 특정 메서드가 일부 기이 한 리플렉션 체계를 통해 호출되지 않는다는 것을 확실히 알 수있는 방법이 없기 때문입니다. 그래서 아마도 런타임과 정적 분석의 조합이 가장 좋을 수도 있습니다.
Proguard와 너무 옵션 ( http://proguard.sourceforge.net/) 될 수있다:
는 "ProGuard에서 어떤 용도는 다음과 같습니다 그것이 제거 할 수 있도록
은 ASM 바이트 코드 분석 라이브러리 (http://asm.ow2.org)를 사용하여 (이 글을 읽고 후 1 시간 이내)도 http://proguard.sourceforge.net/manual/examples.html#deadcode
당신은 그것을 위해 자신의 유틸리티를 쓸 수 있습니다 참조하십시오. ClassVisitor와 MethodVisitor를 구현해야한다. ClassReader를 사용하여 라이브러리의 클래스 파일을 구문 분석합니다.
계산 유지 보수를 위해지도를 유지 관리하십시오. 키는 메소드를 나타냅니다 (아래 참조). 다음은 몇 가지 코드입니다.
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());
}
}
즐기십시오!
메서드 A가 메서드 B를 호출하면 메서드 A가 사용되지 않아도 메서드 B가 "사용됨"으로 표시되므로이 메서드를 사용하는 것이 옳지 않습니다. "중고품"에 대해 일시적으로 폐쇄해야합니다. –
IntelliJ에는 메서드, 필드, 한정자가 더 제한 될 수있는 클래스를 검색하는 도구가 있습니다.또한 이러한 변경 사항을 적용하기위한 빠른 수정을 통해 많은 작업을 절약 할 수 있습니다. 비용을 지불하고 싶지 않으면 30 일간의 평가 라이센스를 얻을 수 있습니다.이 라이센스는 코드를 변경할 수있는 충분한 시간입니다. 자주해야 할 일이 아닙니다.
BTW : IntelliJ는 코드 품질을 향상시키기 위해 약 650 개의 코드 검사를 실시하고 있으며, 약 절반에 자동 수정 기능이 있으므로이 코드를 사용하여 코드를 리팩터링하거나 정리하는 데 몇 일을 소비하는 것이 좋습니다.
Dead Code Detector을 참조하십시오. 정적 분석을 사용하여 사용하지 않는 코드를 찾으십시오.
단위 테스트 범위를 사용하는 대신 실행중인 응용 프로그램을 모니터링하는 Cobertura 또는 Emma와 같은 것을 원하십니까? –