2012-02-19 24 views
6

जावा में जादू विधियों का उपयोग करने का कोई तरीका है जैसे PHP में __call है?जावा में जादुई रूप से कॉल विधियां

उदाहरण के लिए:

class foo { 
    @Setter @Getter 
    int id; 

    @Getter 
    Map <String, ClassInFoo> myMap; 

    protected class ClassInFoo { 
      @Setter @Getter 
      String name; 
    } 

    @Setter 
    String defaultKey; 
} 

मैं मनुष्य और सेटर तरीके के लिए Project Lombok एनोटेशन उपयोग कर रहा हूँ कोड सरल करने के लिए।

मान लें कि मेरे मानचित्र में स्ट्रिंग द्वारा मैप किए गए कई आइटम हैं और डिफ़ॉल्ट के डिफ़ॉल्ट डिफ़ॉल्ट को परिभाषित करता है।

मुझे क्या चाहिए foo.getName() पर कॉल करने में सक्षम होना है जो डिफ़ॉल्ट नाम को foo.myMap.get(defaultKey).getName() के रूप में वापस कर देगा।

कारण मैं मैन्युअल रूप से सभी गेटर्स लिख नहीं सकता हूं कि वास्तव में फू क्लास जेनेरिक के साथ विरासत में है और आंतरिक वर्ग अलग हो सकता है।

मैं इन सबसे छुटकारा जरूरत है की तरह कुछ:

function Object __call(method) { 
      if (exist_method(this.method) 
       return this.method(); 
      else 
       return this.myMap.get(defaultKey).method(); 
    } 

इस किसी भी तरह जावा में संभव है?

संपादित करें: https://gist.github.com/1864457

ऐसा करने का एकमात्र कारण के लिए "आशुलिपि" आंतरिक कक्षा में तरीकों है:

मैं मैं क्या यहाँ प्राप्त करने के लिए कोशिश कर रहा हूँ की एक और अधिक सटीक उदाहरण दिया।

+0

एक दिलचस्प सवाल के रूप में उपवास, लेकिन इसे ओओपी टैग नहीं किया जाना चाहिए। जिस विशेषता में आप रुचि रखते हैं वह ऑब्जेक्ट उन्मुख नहीं है और वास्तव में भी गतिशील नहीं है। – Perception

+1

आम तौर पर आप अपने खुद के गेटटर और सेटर्स चाहते हैं जिन्हें आप अपने आईडीई के साथ उत्पन्न कर सकते हैं। उदाहरण के लिए, गेटटर को एक परिवर्तनीय संग्रह वापस करने का अच्छा विचार नहीं है। इसके बजाय आप 'क्लासइनफू getMyMap (स्ट्रिंग नाम) ' –

+0

हाँ अच्छी तरह से, मैं सभी गेटर्स लिख सकता हूं, लेकिन मुझे यह डुप्लिकेट और बदसूरत मिला। मुझे यह पसंद आएगा ताकि मेरे एचटीएमएल कोडिंग लोग इन विधियों का अनुरोध कर सकें। –

उत्तर

5

आप बिल्कुल कर सकते हैं reflection तरह

public Method getMethod(String name, Class<?>... parameterTypes) 

कि अगर एक वर्ग को देखने के लिए इस्तेमाल किया जा सकता अपनी सुविधाओं का उपयोग कर के माध्यम से कुछ तरीकों को परिभाषित किया गया है लेकिन मुझे नहीं लगता कि आपकी समस्या को उचित उपयोग के साथ हल नहीं किया जा सकता है o च इंटरफेस, विरासत और तरीकों

विशेषताएं प्रतिबिंब की तरह का अधिभावी, कुछ अन्यथा न सुलझा हुआ, मुद्दों के प्रबंधन के लिए प्रदान की जाती हैं लेकिन जावा पीएचपी, ताकि आप इसे का उपयोग जब संभव से बचने के लिए प्रयास करना चाहिए यह दर्शन की में नहीं है के बाद से नहीं है भाषा।

+0

पढ़ें प्रतिबिंब ने मुझे इस मुद्दे को हल करने में मदद की। धन्यवाद! –

2

क्या यह विरासत का पूरा बिंदु नहीं है और ओवरराइडिंग है?

बेस वर्ग:

public Object foo() { 
    return this.myMap.get(defaultKey).method(); 
} 

उपवर्ग:

@Overrides 
public Object foo() { 
    return whateverIWant; 
} 
+0

मैंने यहां एक और सटीक उदाहरण बनाया है: https://gist.github.com/1864457 - क्या आप कृपया अपने प्रस्ताव को विस्तार से समझा सकते हैं? धन्यवाद। –

+0

यदि फलों की कक्षा में getName() विधि इस तरह कार्यान्वित की गई है, तो यह अपेक्षित काम करेगा: वापसी 'getContents()। Get (getDefaultKey())। GetName() '। क्या आप समझ रहे हैं कि विरासत और ओवरराइडिंग कैसे काम करते हैं? Http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html –

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