2016-10-22 6 views
2

자바 클래스의 상속 트리의 깊이를 파악하는 분석기를 만들고 있습니다.자바 클래스의 상속 트리의 깊이를 파악하는 방법은?

자바 파일에서이 정보를 정확하게 찾으려면 javaparser를 사용하고 있습니다.

어떻게 DIT를 계산할 수 있습니까?

저는 .getSuperClass()를 알고 있지만 정적 분석기의 일부로 Java 파일에서 구문 분석 할 때 유용하지 않습니다.

+1

이 문항은 문맥이나 코드를 제공하지 않았기 때문에 너무 광범위합니다. 일반적으로 클래스 선언과 모든 수퍼 클래스의 소스를'Object'에 도달 할 때까지 재귀 적으로 파싱해야합니다. 소스가없는 수퍼 클래스의 경우 소스 (올바른 버전)를 가져 오거나 컴파일 된'.class' 파일에서 클래스 선언을 추출해야합니다. 이것은 매우 복잡한 작업이며 모든 것을하는 방법을 설명하는 것은 StackOverflow의 범위를 벗어납니다. 이 질문을해야한다면 전반적인 문제를 해결할 준비가되지 않았을 것입니다. –

+1

@ JimGarrison 나는 생각이 아주 간단하다고 생각했다. 자바 클래스를 가져 와서 Object에 도달 할 때까지 작업한다. 얼마나 많은 클래스가 상속이 깊은 지 계산한다. – srysry

+1

설명하기는 "간단하다"하지만 많은 합병증이있다. 소스 코드가없는 클래스를 처리하는 등의 과정을 거쳐야합니다. 당신이 요구하는 것이 명확하지 않습니다. 누군가 당신에게 코드를 제공하기를 희망 했습니까? –

답변

1

간단히 말해서 JavaParser만으로는 그렇게 할 수 없지만 JavaParser를 보완하고 JavaParser를 유지하는 동일한 팀이 관리하는 라이브러리 인 JavaSymbolSolver을 사용하면 매우 간단합니다.

실제로 JavaParser는 당신에게 단지 AST를 제공합니다. AST에서 클래스의 수퍼 클래스는 단지 이름 일뿐입니다. JavaSymbolSolver는 해당 이름에 첨부 된 유형 선언을 찾습니다. 이 선언에는 모든 조상을 찾고이 질문에 답하는 데 필요한 모든 정보가 있습니다 (어떤 인터페이스가 구현되었는지, 직접 및 간접적으로 어떤 필드가 상속되었는지, 어떤 방법 등)

면책 조항 : 저는 JavaSymbolSolver의 원 저자입니다

+1

Java8의 모든 난잡함을 처리합니까? 이름 확인 규칙은 실제로 복잡합니다. 어떻게 테스트합니까? –

+0

코드가 상용 제품과 같이 테스트되지 않았습니다. 여가 시간에 지어진 비교적 젊은 프로젝트입니다. 경우에 따라 lambdas 유형 유추가 제대로 작동하지 않을 수도 있지만 슈퍼 클래스를 가져 오는 것과 관련하여 일반 매개 변수를 고려하여 정상적으로 작동해야합니다. Java 8을 사용하는 몇 가지 프로젝트에서 모든 메서드 호출을 올바르게 확인했는지 테스트하여 테스트했습니다. 모든 상황에서이 작업을 완벽하게 수행 할 사람이 없을 것이라고 생각합니다. 문제는 생각합니다. 예상대로 작동해야하며 PR은 환영받습니다. –

+0

예, 아마도 상위 클래스 관계를 얻는 것이 더 쉬울 것입니다. 그리고 그것은 DIT에 필요한 모든 것입니다. –

관련 문제