2010-07-17 3 views
7

이클립스 플러그인을 작성 중이며 ArrayList의 작업 공간에있는 모든 클래스를 반환하는 메소드를 만들려고했습니다 < \ Class < \ ">> (" html은 그렇게하지 못하게하기 때문에 일반 괄호를 포함 시키십시오.Eclipse의 현재 작업 공간에서 모든 클래스 가져 오기

private ArrayList<Class<?>> getAllClasses() throws JavaModelException { 

ArrayList<Class<?>> classList = new ArrayList<Class<?>>(); 

IWorkspace workspace = ResourcesPlugin.getWorkspace(); 
IWorkspaceRoot root = workspace.getRoot(); 
IProject[] projects = root.getProjects(); 

for (IProject project : projects) { 
    IJavaProject javaProject = JavaCore.create(project); 
    IPackageFragment[] packages = javaProject.getPackageFragments(); 

    for (IPackageFragment myPackage : packages) { 
    IClassFile[] classes = myPackage.getClassFiles(); 

    for (IClassFile myClass : classes) { 
    classList.add(myClass.getClass()); 
    } 
    } 
} 

    return classList; 
} 

이, 그러나, 작동하지 않는 것 : 여기

는 내가 가지고있는 코드입니다. 나는 프린트 라인을 가지고 있었고, 관련없는 클래스 (예 : Java \ jre6 \ lib \ rt.jar의 클래스)도 포함하고 있다는 것을 알았습니다. 어떤 제안?

+0

http://help.eclipse.org/helios/index.jsp?topic=/org.eclipse.jdt.doc.isv/guide/jdt_int_model.htm를 참조하십시오 여기 당신은 찾을 수 있습니다 JDT 모델에 대한 꽤 좋은 설명. – GeT

답변

0

아마도 IJavaProject.getAllPackageFragmentRoots() 메서드를 사용하여 모든 원본 폴더를 가져온 다음 ICompilationUnits를 가져올 수 있습니다.

1

난 당신이 뭘 원하는지 확실하지 않다 :에서

  • 실행중인 플러그인이 다른 편집자 (플러그인으로 JVM에서 실행 즉, 클래스 모든 클래스를 보여 이클립스, 뷰, 이클립스 기계)?
  • 실행중인 Eclipse 플러그인에서 열려있는 Java 프로젝트에 빌드 된 모든 클래스를 작업 영역에 표시 하시겠습니까? 프로젝트가되고 있기 때문에 (당신이 단어를 사용하기 때문에 나는이 당신을 위해 무엇을 찾고 있는지 의심 "작업 공갂".)

참고 후자의 경우에, 당신은 실제 자바 Class<...> 개체를 얻을 수 없습니다 편집 및 컴파일 된 플러그인은 실행을 위해 플러그인과 동일한 JVM으로로드되지 않습니다. 플러그인 코드가 Eclipse IDE 및 Eclipse JDT 툴 코드와 함께 실행됩니다. 열려있는 프로젝트의 유일한 시간 클래스는 실행을 위해로드됩니다 (Class<...> 오브젝트를 어딘가에서 생성)는 해당 프로젝트 중 하나를 시작하거나 디버깅 할 때입니다. . . 이 경우에는 새로운 JVM을 다루고 있으며 플러그인은 더 이상 존재하지 않습니다. 말이 돼?

내가 올바르게 읽는다면 "클래스 파일"이 아닌 "컴파일 단위"를 찾고 싶을 것입니다. "컴파일 단위"는 .java 소스 파일에 해당하는 반면 "클래스 파일"은 미리 빌드 된 바이너리 클래스 파일 (주로 JAR)과 일치합니다. 아니면 두 가지가 필요할 수도 있습니다. 더 나은 아직, 그것은 당신이 정말로 원하는 것들처럼 들리는 "유형"입니다.

매우 찾기 좋은 정보를 찾기 위해 JDT Core guide을 확인하십시오. Java 모델 레벨에서는 분석이 가능하지만 좀 더 자세한 분석 (예 : "내부"메소드 정의 찾기)을 위해서는 코드 청크를 AST로 구문 분석하고 거기에서부터 분석해야합니다. 자바 모델은 사용하기에 매우 편리하지만, AST는 처음에는 다소 어려울 수 있습니다.

유형을 찾고 네비 게이트하기 위해 Java 검색 엔진 (위 문서에 설명되어 있음)과 IType.newTypeHierarchy()도 고려해야합니다.

행운을 빈다.

1

당신이 시도해야합니다

for (final ICompilationUnit compilationUnit : packageFragment.getCompilationUnits()) { 
     // now check if compilationUnit.exits 
} 

당신은 바이너리 유형에 대한 CompilationUnit을하지 않습니다.

0

현재 패키지의 Java 클래스 이름을 나열하고이를 클래스 목록에 추가하는 경우 (모든 클래스의 상위 클래스 이름으로 PARENT_CLASS를 바꾸십시오) Eclipse 프로젝트에 대한 훨씬 간단한 해결책이 있습니다. :

List<PARENT_CLASS> arrayListOfClasses = new ArrayList<>(); 

    String currentDir = new java.io.File("").toURI().toString().split("file:/")[1]; 
    System.out.println("currentDir=" + currentDir); 
    String[] dirStringTab = currentDir.split("/"); 
    String currentPackageName = dirStringTab[dirStringTab.length-1]; 
    System.out.println("currentPackageName=" + currentPackageName); 

    File dir = new File("./src/" + currentPackageName + "/"); 
    File[] filesList = dir.listFiles(); 
    String javaClassNameWithoutExtension = ""; 

    for (File file : filesList) { 
     if (file.isFile()) { 
      System.out.println(javaClassNameWithoutExtension); 
      javaClassNameWithoutExtension = file.getName().split(".java")[0]; 

     Class c = Class.forName(javaClassNameWithoutExtension); 
     Object a = c.newInstance(); 
     arrayListOfClasses.add(a); 

     } 
    } 
관련 문제