2013-06-28 3 views
4

제네릭 매개 변수화 및 로컬 변수 유형에 사용되는 클래스를 포함하여 Java 클래스의 모든 종속성을 가져 오려고합니다. 지금까지 내가 찾은 최고의 프레임 워크는 아파치 bcel입니다. 그것을 사용하여 바이트 코드에서 모든 필드, 메서드 인수 및 로컬 변수를 쉽게 찾을 수 있습니다. 기본적으로 제네릭 및 지역 변수 유형을 제외한 모든 것. 예를 들어, 라인 List<Point> points = new ArrayList<Point>();에서 하나의 종속성을 찾을 수 있습니다 - 배열을 사용하여 JavaClass.getConstantPool() bcel에서 ArrayList. List 인터페이스도 Point 클래스도 감지 할 수 없습니다. 나는 또한 tattletale와 CDA를 불행히도 성공하지 못했습니다 (같은 결과). 수입을 검사하는 것만으로는 충분하지 않습니다. 동일한 패키지의 의존성이 필요하며 와일드 카드를 허용하지 않습니다. 어떤 도움을 주셔서 감사합니다.Java 클래스의 모든 종속성 찾기

+0

런타임시 바이트 코드에서이 작업을 수행하려고합니까? 컴파일 시간? –

+0

모든 정적 종속성 (런타임이 아님)을 찾고 싶습니다. 아마도 바이트 코드를 읽는 것이 최선의 방법 일 것입니다. 하지만 소스 코드를 파싱 해 볼 수는 있습니다. (단지 최선의 아이디어로 보이지 않고 그 해결책을 찾지 못했습니다.) – goobar

+0

모든 소스 종속성이 클래스 파일 (메소드 내의 일반 유형, 인라인 상수)에 있어야 할 필요는 없습니다. 알맞은 텍스트 편집기 나 유닉스'strings'에서 클래스 파일을보십시오. –

답변

5

나는 결국 해결책을 찾았습니다. ASM Bytecode Framework은 올바른 도구입니다. 공식 tutorial과 오른쪽 example을 사용하면 필요한 모든 의존성을 쉽게 얻을 수 있습니다. 이 예에서는 이미 원하는 방문자의 클래스 DependencyVisitor이 있습니다. 올바른 서식을 얻으려면 나는 단지 하나의 방법 DependencyVistitor의 예제 코드를 변경했다, 그래서 그것은 단지 패키지 대신 전체 클래스 이름을 추가합니다

private String getGroupKey(String name) 
{ 
     //Just comment that block so you can get full class names instead of package only 
     /* 
     int n = name.lastIndexOf('/'); 
     if (n > -1) 
     { 
      name = name.substring(0, n); 
     } 
     */ 
     // Replace resource char with package separator char   
     packages.add(name.replace("/", ".")); 
     //packages.add(name); 
     return name; 
} 

DependencyVisitor 코드를 보면 쉽게 그것이 무엇을 이해하고 그것을 수정할 수 있습니다 필요합니다. 그것을 예제 클래스에서 실행하면 멋지고 유용한 결과를 얻을 수 있습니다 : [java.util.ArrayList, java.lang.Object, java.util.List, java.awt.Point, goobar.test.asmhello.TestClass, java.lang.String, java.lang.Integer, java.awt.Graphics, goobar.test.asmhello.TestClass2]. 여기에는 사용 된 모든 클래스와 인터페이스 및 제네릭 매개 변수화에 사용되는 모든 유형이 포함됩니다.

+0

완벽하고 이러한 문제가 발생하지 않았지만 일반적으로 특수 효과로 식별 할 수 있지만 멋지다. –

+0

예제 코드는 [here] (http://websvn.ow2.org/listing.php?repname=asm&path)로 옮겼습니다. = % 2Ftrunk % 2Fasm % 2Fexamples % 2F dependencies % 2Fsrc % 2Forg % 2Febjectweb % 2Fasm % 2Fdepend % 2F). – seanf

관련 문제