2010-07-17 6 views
7

में वर्तमान वर्कस्पेस से सभी वर्गों को प्राप्त करना एक ग्रहण प्लगइन लिख रहा है, और मैं एक ऐसी विधि बनाने की कोशिश कर रहा था जो एक एररेलिस्ट < \ कक्षा < \? >> में वर्कस्पेस में सभी कक्षाएं लौटाता है। (मैंने " \ "जेनेरिक ब्रैकेट्स को शामिल करने के लिए एचटीएमएल मुझे अन्यथा ऐसा करने नहीं देगा)।ग्रहण

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

लेकिन यह काम किया जाना प्रतीत नहीं होता:

यहाँ कोड मैं है। मेरे पास कुछ प्रिंटलाइन थीं, और मुझे पता चला कि इसमें अप्रासंगिक कक्षाएं शामिल हैं (यानी जावा \ jre6 \ lib \ rt.jar से कक्षाएं)। कोई सुझाव?

+0

कृपया http://help.eclipse.org/helios/index.jsp?topic=/org.eclipse.jdt.doc.isv/guide/jdt_int_model.htm का उल्लेख यहाँ आप एक मिल सकता है जेडीटी मॉडल का बहुत अच्छा विवरण। – GeT

उत्तर

0

शायद आप सभी स्रोत फ़ोल्डर प्राप्त करने के लिए IJavaProject.getAllPackageFragmentRoots() विधि का उपयोग कर सकते हैं, और फिर इसमें ICompilationUnits प्राप्त कर सकते हैं।

1

मुझे यकीन है कि आप क्या करना चाहते हैं नहीं कर रहा हूँ:

  • में एक चल ग्रहण प्लग-इन, सभी वर्गों है कि अन्य संपादकों के लिए यानी कक्षाएं प्लग-इन के साथ JVM में चल रहे हैं (दिखाने के लिए, विचार, ग्रहण मशीनरी)?
  • एक चल रहे ग्रहण प्लग-इन में, वर्कस्पेस में खुली जावा परियोजनाओं में निर्मित सभी कक्षाएं दिखाएं? उत्तरार्द्ध मामले में (जब से तुम शब्द का इस्तेमाल किया "कार्यस्थान", मुझे लगता है कि यह आपके लिए क्या देख रहे हैं।)

ध्यान दें, यदि आप वास्तविक जावा Class<...> वस्तुओं को पाने के लिए सक्षम नहीं होगा क्योंकि परियोजनाओं जा रहा है संपादित और संकलित आपके प्लग-इन के समान JVM में निष्पादन के लिए लोड नहीं होते हैं। आपका प्लग-इन कोड एक्लिप्स आईडीई और ग्रहण जेडीटी उपकरण कोड के साथ निष्पादित होगा; खुली परियोजनाओं में एकमात्र समय कक्षा निष्पादन के लिए लोड की जाएगी (Class<...> वस्तुओं का उत्पादन कहीं भी) जब आप उन परियोजनाओं में से किसी एक को लॉन्च या डिबग करेंगे। । । इस मामले में आप एक नए नए जेवीएम से निपट रहे हैं, और आपका प्लग-इन अब नहीं है। क्या इसका कोई मतलब है?

यदि मैं आपको सही पढ़ रहा हूं, तो मुझे लगता है कि आप शायद "संकलन इकाइयां" ढूंढना चाहते हैं, न कि "कक्षा फाइलें"। "संकलन इकाइयां" .java स्रोत फ़ाइलों के साथ मेल खाते हैं, जबकि "क्लास फाइल" प्री-बिल्ट बाइनरी क्लास फाइलों (अक्सर जेएआरएस में) के साथ मेल खाते हैं। या शायद आपको दोनों की जरूरत है। बेहतर अभी तक, ऐसा लगता है कि आप वास्तव में क्या चाहते हैं कि वे "प्रकार" हैं।

कुछ अच्छी अच्छी जानकारी के लिए JDT Core guide देखें जो कि खोजने में उल्लेखनीय मुश्किल है। ध्यान दें कि जावा मॉडल स्तर पर कुछ विश्लेषण संभव है, लेकिन अधिक विस्तृत विश्लेषण (उदा। "अंदरूनी" विधि परिभाषाओं को देखते हुए) को एएसटी में कोड के पार्सिंग भाग की आवश्यकता होगी और वहां से जा रहे हैं। जावा मॉडल का उपयोग करने के लिए बहुत सुविधाजनक है, लेकिन एएसटी सामान पहली बार थोड़ा मुश्किल हो सकता है।

जावा खोज इंजन (उपरोक्त के पास दस्तावेज) और IType.newTypeHierarchy() पर विचारों को ढूंढने और नेविगेट करने के लिए भी विचार करें।

शुभकामनाएं!

1

आप प्रयास करना चाहिए:

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

आप द्विआधारी प्रकारों के लिए एक CompilationUnit नहीं मिलता है।

0

मेरे पास ग्रहण प्रोजेक्ट के लिए बहुत आसान समाधान है यदि आप वर्तमान पैकेज के लिए जावा क्लास नाम सूचीबद्ध करने की तलाश में हैं और उन्हें कक्षाओं की सूची में जोड़ें (कृपया अपने सभी वर्गों के मूल श्रेणी के नाम से PARENT_CLASS को प्रतिस्थापित करें) :

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

     } 
    }