2009-11-11 10 views
5

मैं प्लगइन विकास ग्रहण करने के लिए नया हूं और मैं पूर्ण विधि नाम के स्ट्रिंग प्रस्तुति के लिए एक IMethod को बदलने की कोशिश कर रहा हूं। अर्थात।पूर्ण विधि नाम प्राप्त करने के लिए जेडीटी का उपयोग करें

my.full.package.ClassName.methodName(int param, String string) 

अब तक मैं अपने खुद के समाधान रोल सौंपने के लिए पड़ा है। क्या कोई बेहतर तरीका है?

private static String getMethodFullName(IMethod iMethod) 
{ 
    String packageString = "[Default Package]"; 
    try { 
     IPackageDeclaration[] declarations = iMethod.getCompilationUnit().getPackageDeclarations(); 
     if(declarations.length > 0) 
     { 
      packageString = declarations[0].getElementName(); 
     }   
    } catch (JavaModelException e) { 
    } 

    String classString = iMethod.getCompilationUnit().getElementName(); 
    classString = classString.replaceAll(".java", ""); 

    String methodString = iMethod.getElementName() + "("; 
    for (String type : iMethod.getParameterTypes()) { 
     methodString += type + ","; 
    } 
    methodString += ")"; 

    return packageString + "." + classString + "." + methodString; 
} 

उत्तर

3

धन्यवाद इयान करने के लिए और कुछ और अधिक शोध मैं इस समाधान के साथ आए हैं। यह इस जेडीटी में बनाया जाना चाहिए की तरह कुछ की तरह लगता है ....

import org.eclipse.jdt.core.Signature; 

private static String getMethodFullName(IMethod iMethod) 
{ 
     StringBuilder name = new StringBuilder(); 
     name.append(iMethod.getDeclaringType().getFullyQualifiedName()); 
     name.append("."); 
     name.append(iMethod.getElementName()); 
     name.append("("); 

     String comma = ""; 
     String[] parameterTypes = iMethod.getParameterTypes(); 
     try { 
      String[] parameterNames = iMethod.getParameterNames(); 
      for (int i=0; i<iMethod.getParameterTypes().length; ++i) { 
       name.append(comma); 
       name.append(Signature.toString(parameterTypes[i])); 
       name.append(" "); 
       name.append(parameterNames[i]); 
       comma = ", "; 
      } 
     } catch (JavaModelException e) { 
     } 

     name.append(")"); 

     return name.toString(); 
} 
+0

यह अच्छा है मैंने कभी हस्ताक्षर वर्ग कभी नहीं देखा – iain

0

मुझे यकीन है कि यह खाते में सभी मामलों ले जाएगा नहीं कर रहा हूँ (विधि एक आंतरिक वर्ग, एक गुमनाम वर्ग के भीतर, सामान्य मानकों के साथ ...)

यह तरीकों हस्ताक्षर की बात आती है, वर्गों के लिए इस पर गौर कर रहे हैं:

आपको jdt.core.dom.IMethodBinding प्राप्त करने की आवश्यकता है, जिससे आप अपनी जरूरतों को पूरा कर सकते हैं।

आप एक MethodInvocation है, तो आप कर सकते हैं:

//MethodInvocation node 
ITypeBinding type = node.getExpression().resolveTypeBinding(); 
IMethodBinding method=node.resolveMethodBinding(); 
+0

हां। वॉनसी एक अच्छा मुद्दा बनाता है। स्थानीय वर्गों और अज्ञात कक्षाओं का प्रतिनिधित्व करने वाली IType बाइंडिंग प्राप्त होने पर खाली स्ट्रिंग वापस कर देगी FullyQualifiedName() कहा जाता है। यह समझ में आता है, क्योंकि उनके पास कोई आधिकारिक नाम नहीं है, लेकिन यदि आप एक अद्वितीय पहचानकर्ता के लिए पूरी तरह से योग्य नामों का उपयोग कर रहे हैं, तो आप getKey() के बजाय ... –

4

आप पूरी तरह से योग्य नाम प्रकार

method.getDeclaringType().getFullyQualifiedName(); 

प्रयोग करने के लिए प्राप्त कर सकते हैं यह शायद संकलन इकाई से पैकेज तक पहुँचने की तुलना में आसान है । आप में से बाकी का काम सही दिखता है।

एक छोटा सा बिंदु: आपको मानक स्ट्रिंग में जोड़ने की बजाय स्ट्रिंग बनाने के लिए स्ट्रिंगबिल्डर का उपयोग करना चाहिए। स्ट्रिंग्स अपरिवर्तनीय हैं इसलिए अतिरिक्त अपर्याप्त temparary वस्तुओं के भार बनाता है।

private static String getMethodFullName(IMethod iMethod) 
{ 
     StringBuilder name = new StringBuilder(); 
     name.append(iMethod.getDeclaringType().getFullyQualifiedName()); 
     name.append("."); 
     name.append(iMethod.getElementName()); 
     name.append("("); 

     String comma = ""; 
     for (String type : iMethod.getParameterTypes()) { 
       name.append(comma); 
       comma = ", "; 
       name.append(type); 
     } 
     name.append(")"); 

     return name.toString(); 
} 
+0

का उपयोग करने पर विचार करना चाहेंगे। मुझे पैरामीटर प्रकारों को और अधिक पठनीय बनाने का एक तरीका मिला है, इसलिए मैं इस समाधान को अपने साथ जोड़ दूंगा। –

संबंधित मुद्दे