2014-04-15 6 views
-3

각 Java 클래스의 위치에 대한 정보가 필요합니다. Java 파일에는 여러 클래스가있을 수 있습니다. 따라서 자바 파일 이름을 얻는 것은 올바른 방법이 아닙니다 ... 내가 생각해 볼 수있는 한 가지 가능한 방법은 Eclipse AST 라이브러리를 사용하는 것입니다. 하지만 Eclipse AST에 익숙하지 않기 때문에 더 쉬운 방법이 있는지 궁금합니다 ... Eclipse AST를 사용해야하는 경우 관련 정보를 검색하는 데 도움이되는 코드 스 니펫을 제공하십시오.Java 파일에서 Java 클래스 이름 가져 오기

업데이트 :

입력 : 자바 프로젝트의 위치

출력 : 자바 파일에 선언 된 자바 파일과 자바 클래스 간의 정보를 매핑.

A.java에서

, A.class 달러 (A $) InnerA.class 및 B.class

public class A { 
    System.out.println("A class"); 
    class InnerA{ 
     System.out.println("A inner class"); 
    } 
} 

class B { 
    System.out.println("B class"); 
} 

A.java 파일 링크는 내가 생각하는거야

+0

'/ foo/bar/A.java'에'A'와'B' 클래스가 정의되어 있다면,'B'의 위치에 대한 정답을 어떻게 생각하십니까? 파일 이름과 라인 번호가 필요합니까? –

+1

자바 (소스) 파일이나 클래스 (바이너리) 파일에 대해 이야기하고 있습니까? – Puce

+0

"Eclipse AST"가 아니라 "Eclipse JDT"를 의미한다고 생각합니다. –

답변

1

당신이 찾는 방법을 알고 프로젝트 디렉토리에있는 모든 파일 .java. 다음과 같이 javaparser 사용하여 각 파일에 선언 된 유형을 나열 할 수 있습니다 : 내 예에서

public class ParserTest { 

    public static void main(String[] args) throws Exception { 
    CompilationUnit cu; 

    try (FileInputStream in = new FileInputStream("C:\\tmp\\Test.java")) { 
     cu = JavaParser.parse(in); 
    } 

    List<TypeDeclaration> types = cu.getTypes(); 
    ArrayList<String> parents = new ArrayList<>(); 

    for (TypeDeclaration typeDeclaration : types) { 
     printTypes(typeDeclaration, parents); 
    } 
    } 

    private static void printTypes(BodyDeclaration item, List<String> parents) { 
    if (item instanceof TypeDeclaration) { 

     TypeDeclaration type = (TypeDeclaration) item; 

     System.out.println(getClassName(type.getName(), parents)); 
     List<BodyDeclaration> members = type.getMembers(); 

     List<String> cloneOfParents = new ArrayList<>(parents); 
     cloneOfParents.add(type.getName()); 

     for (BodyDeclaration bodyDeclaration : members) { 
     printTypes(bodyDeclaration, cloneOfParents); 
     } 
    } 
    } 

    private static String getClassName(String name, List<String> parents) { 
    StringBuilder builder = new StringBuilder(); 
    for (String string : parents) { 
     builder.append(string); 
     builder.append("."); 
    } 

    return builder.append(name).toString(); 
    } 
} 

Test.java은 포함 :

public class Test { 

    class InnerClass { 
    } 

} 

class Foo {} 

및 인쇄 코드 :

Test 
Test.InnerClass 
Foo 
0

나는 천국을 ' @ Duncan의 대답에 주목했습니다 .. JDT AST 파서를 사용했습니다. 나는이 게시물, http://www.programcreek.com/2011/11/use-jdt-astparser-to-parse-java-file/을 읽고, 나는 다음과 같이 코드를 작성할 수있다.

//use ASTParse to parse string 
public static void parse(String str) { 
    ASTParser parser = ASTParser.newParser(AST.JLS3); 
    parser.setSource(str.toCharArray()); 
    parser.setKind(ASTParser.K_COMPILATION_UNIT); 

    final CompilationUnit cu = (CompilationUnit) parser.createAST(null); 
    cu.accept(new ASTVisitor() { 
     String packageName=""; 

     public boolean visit(TypeDeclaration node) { 
      String className=node.getName().getFullyQualifiedName(); 
      if (packageName!="") 
       System.out.println(packageName+"."+className); 
      else 
       System.out.println(className); 

      return false; 
     } 

     public boolean visit(PackageDeclaration node) { 
      packageName=node.getName().getFullyQualifiedName(); 
      return false; 
     } 
    }); 

} 

이 코드는 내부 클래스를 인쇄하지 않기 때문에 정확하게 원하는 것은 아닙니다. 그러나 클래스 디렉토리에서 클래스를 검색하면 인쇄 된 클래스 이름으로 시작하는 내부 클래스를 얻을 수 있습니다.

감사합니다. @ 던컨. 나는 당신의 코드를 읽고 코드를 실행했다. 그것은 매력처럼 작동합니다. 귀하의 코드에서 일부 문법은 Java 7 문법입니다. 나는 아직 그것에 익숙하지 않다. 하지만 당신의 코드에서 배웁니다. :)