2010-07-28 11 views
6

का उपयोग करके मुझे हाल ही में कुछ जावा कोड (विधियों को जोड़ने, कुछ क्षेत्रों के हस्ताक्षर बदलने और विधियों को हटाने) की आवश्यकता में आ गया है और मुझे लगता है कि यह सब ग्रहण किया जा सकता है हालांकि ग्रहण एसडीके के उपयोग एएसटी।ग्रहण एएसटी

मुझे कुछ शोध से पता है कि कैसे एक स्रोत फ़ाइल में पार्स करना है, लेकिन मुझे नहीं पता कि ऊपर उल्लिखित चीजों को कैसे करना है। क्या किसी को एक अच्छा ट्यूटोरियल पता है या क्या कोई मुझे इन मुद्दों को हल करने के बारे में एक संक्षिप्त विवरण दे सकता है?

धन्यवाद एक बहुत,

ExtremeCoder


संपादित करें:

मैं अब JCodeModel में और अधिक देखने के लिए शुरू कर दिया है और मुझे लगता है कि यह बहुत उपयोग करना आसान हो सकता है, लेकिन मैं पता नहीं है कि क्या मौजूदा दस्तावेज़ इसे लोड किया जा सकता है?

यदि यह काम कर सकता है तो मुझे बताएं;)

धन्यवाद।

उत्तर

4

मैं इस समस्या को पूरा स्रोत कोड यहां पोस्ट नहीं करूंगा क्योंकि यह काफी लंबा है लेकिन मैं लोगों को शुरू कर दूंगा।

सभी दस्तावेज़ है कि आप की आवश्यकता होगी यहां हैं:। http://publib.boulder.ibm.com/infocenter/iadthelp/v6r0/index.jsp?topic=/org.eclipse.jdt.doc.isv/reference/api/org/eclipse/jdt/core/dom/package-summary.html

Document document = new Document("import java.util.List;\n\nclass X\n{\n\n\tpublic void deleteme()\n\t{\n\t}\n\n}\n"); 
ASTParser parser = ASTParser.newParser(AST.JLS3); 
parser.setSource(document.get().toCharArray()); 
CompilationUnit cu = (CompilationUnit)parser.createAST(null); 
cu.recordModifications(); 

कि स्रोत कोड है कि आप में से पारित से आप के लिए एक संकलन इकाई पैदा करेगा

अब यह एक सरल कार्य है कि आपके द्वारा पारित किए गए वर्ग परिभाषाओं के अंदर सभी विधियों को प्रिंट करता है:

List<AbstractTypeDeclaration> types = cu.types(); 
for(AbstractTypeDeclaration type : types) { 
    if(type.getNodeType() == ASTNode.TYPE_DECLARATION) { 
     // Class def found 
     List<BodyDeclaration> bodies = type.bodyDeclarations(); 
     for(BodyDeclaration body : bodies) { 
      if(body.getNodeType() == ASTNode.METHOD_DECLARATION) { 
       MethodDeclaration method = (MethodDeclaration)body; 
       System.out.println("method declaration: "); 
       System.out.println("name: " + method.getName().getFullyQualifiedName()); 
       System.out.println("modifiers: " + method.getModifiers()); 
       System.out.println("return type: " + method.getReturnType2().toString()); 
      } 
     } 
    } 
} 

यह आपको सभी शुरू करना चाहिए।

इसमें उपयोग करने में कुछ समय लगता है (मेरे मामले में बहुत कुछ)। लेकिन यह काम करता है और यह सबसे अच्छा तरीका है जिस पर मैं अपना हाथ ले सकता हूं।

गुड लक;)

ExtremeCoder


संपादित करें:

इससे पहले कि मैं भूल जाते हैं, इन आयात कि मैं इस काम के प्राप्त करने के लिए उपयोग किया जाता है (मैं का काफ़ी ले ली इन व्यवस्थित करने के लिए समय):

org.eclipse.jdt.core_xxxx.jar 
org.eclipse.core.resources_xxxx.jar 
org.eclipse.core.jobs_xxxx.jar 
org.eclipse.core.runtime_xxxx.jar 
org.eclipse.core.contenttype_xxxx.jar 
org.eclipse.equinox.common_xxxx.jar 
org.eclipse.equinox.preferences_xxxx.jar 
org.eclipse.osgi_xxxx.jar 
org.eclipse.text_xxxx.jar 

जहां xxxx एक संस्करण संख्या का प्रतिनिधित्व करता है।

1

आप एपीआईएस को कॉल करके ग्रहण के साथ ऐसा कर सकते हैं जो आपको एएसटी में हेरफेर करने देता है।

या आप अपने प्रभाव को प्राप्त करने के लिए प्रोग्राम ट्रांसफॉर्मेशन लागू कर सकते हैं जो एएसटी के माइक्रोस्कोपिक विवरणों पर निर्भर नहीं है।

एक उदाहरण आप निम्नलिखित कार्यक्रम परिवर्तन लिख सकते हैं के रूप में:

add_int_parameter(p:parameter_list, i: identifier): parameters -> parameters 
    " \p " -> " \p , int \i"; 

एक पैरामीटर सूची में कोई भी नाम के साथ एक पूर्णांक पैरामीटर जोड़ने के लिए। यह एपीआई कॉल के पूरे सेट के समान प्रभाव प्राप्त करता है लेकिन यह बहुत अधिक पठनीय है क्योंकि यह आपकी भाषा के सतह वाक्यविन्यास में है (इस मामले में, जावा)।

हमारे DMS Software Reengineering Toolkit ऐसे program transformations स्वीकार कर सकते हैं और उन्हें जावा सहित कई भाषाओं में लागू कर सकते हैं।