2010-07-17 21 views
7

'daki geçerli çalışma alanından tüm sınıfları bir Eclipse eklentisi yazıyorum ve çalışma alanındaki tüm sınıfları bir ArrayList < \ Class < \? >> içinde ekleyen bir yöntem oluşturmaya çalışıyordum ("ekledim" \ "html'den beri genel parantezleri dahil etmeme izin vermez)."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; 
} 

Ancak bu, çalışıyor gibi görünmüyor: Burada

Ben koddur. Bazı baskı hatları vardı ve ben de ilgisiz sınıfları (yani Java \ jre6 \ lib \ rt.jar sınıfları) içerdiğini anladım. Baska öneri?

+0

http://help.eclipse.org/helios/index.jsp?topic=/org.eclipse.jdt.doc.isv/guide/jdt_int_model.htm bakınız Burada bir bulabilirsiniz JDT Modelinin oldukça iyi bir tanımı. – GeT

cevap

0

Belki tüm kaynak klasörü almak için IJavaProject.getAllPackageFragmentRoots() yöntemini kullanabilir ve daha sonra içinde ICompilationUnits olsun.

1

Sana ne yapmak istediğini emin değilim: In

  • çalışan bir eklenti, diğer editörlerin (eklenti ile JVM çalışan yani sınıflar tüm sınıfları göstermek Eclipse, Görüşler, Eclipse makineleri)? Gelen
  • çalışan bir Eclipse plug-in, tüm sınıflar çalışma alanında açık Java projelerinde inşa ediliyor göstermek? projeler olmak çünkü (kelimesini kullandı beri bu aradığınız budur şüpheli "çalışma alanı".)

Not ikinci durumda, gerçek Java Class<...> nesneleri almak mümkün olmayacaktır Düzenlenmiş ve derlenmiş, eklentinizle aynı JVM'ye yürütmek için yüklenmez. Eklentinizin ID'si Eclipse IDE ve Eclipse JDT araç kodunun yanında yürütülür; Açık projelerdeki tek zaman sınıfları, bu projelerden birini başlattığınızda veya hata ayıkladığınızda, yürütme için yüklenir (bir yerde Class<...> nesnesi üretir). . . Bu durumda yepyeni bir JVM ile uğraşıyorsunuz ve eklentiniz artık etrafta değil. bu mantıklı mı? Seni doğru okuyorum Eğer

, ben muhtemelen "derleme birimleri" değil "sınıfı dosyalar" bulmak istiyorum. "Derleme birimleri", .java kaynak dosyalarıyla karşılık gelirken, "sınıf dosyaları" önceden oluşturulmuş ikili sınıf dosyalarıyla (genellikle JAR'larda) karşılık gelir. Ya da ikisine de ihtiyacın var. Daha da iyisi, gerçekten istediğin gibi olanların içindeki "tipler" gibi geliyor.

Kontrol öğrenmek için oldukça güçtür bazı oldukça iyi bilgiler için JDT Core guide. Bazı analiz Java Modeli seviyesinde mümkün olduğunu unutmayın, ancak (örneğin, "içeride" yöntemi tanımları bakarak) daha detaylı analizler FBDTÖ bir kod parçalarını ayrıştırma ve oradan gidiş gerektirecektir. Java Modeli oldukça kullanışlıdır, ancak AST maddeleri ilk defa biraz zor olabilir.

Ayrıca türlerini bulma ve navigasyon için Java arama (yukarıda yakın belgelenmiş) motor ve IType.newTypeHierarchy() düşünün.

İyi şanslar!

1

Sen denemelisiniz:

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

Sen ikili türleri için CompilationUnit alamadım.

0

Mevcut paket için java sınıf adlarını listelemek ve bunları bir sınıf listesine eklemek istiyorsanız, bir tutulması için çok daha basit bir çözümüm var (lütfen PARENT_CLASS'u tüm sınıflarınızın üst sınıf adıyla değiştirin) :

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); 

     } 
    }