2013-03-20 12 views
12

से नई परिभाषित विधि को कॉल करना मैंने एक अज्ञात वर्ग की ऑब्जेक्ट को तुरंत चालू किया जिसमें मैंने एक नई विधि जोड़ दी। प्रतिबिंब आप नहीं कर सकते का उपयोग किए बिनाअज्ञात वर्ग

date.someMethod(); 
+2

आप इसे क्यों नहीं देखते हैं और देखते हैं कि यह संकलित और चलाता है या नहीं? – Claudiu

+2

अज्ञात वर्ग का उपयोग क्यों करें - इसके लिए आपकी प्रेरणा क्या है? वास्तव में यह एक ऐसी स्थिति है जहां ** ** अज्ञात वर्गों का उपयोग नहीं करना सर्वोत्तम है। –

+1

आप शायद इसे प्रतिबिंब के साथ कर सकते हैं, लेकिन शायद आप नहीं चाहते ... – Lucas

उत्तर

22

अच्छा सवाल। उत्तर नहीं है। आप सीधे date.someMethod();
पर कॉल नहीं कर सकते हैं आइए पहले समझें कि यह क्या है।

Date date = new Date() { ... }; 

ऊपर अनाम है उप-वर्ग जो दिनांक वर्ग प्रदान कर रहा है (कोई नाम नहीं है)।

जब आप कोड को देखने की तरह,

Runnable r = new Runnable() { 

     public void run() { 

     } 

    }; 

इसका मतलब है कि आप अनाम परिभाषित किया है वर्ग जो लागू कर रहा है (विस्तार नहीं) Runnable इंटरफेस (कोई नाम नहीं है)।

तो तुम date.someMethod() जब फोन यह क्योंकि someMethodनहींsuperclass. में परिभाषित उपरोक्त मामले सुपर क्लास में है Date वर्ग है फोन करने में सक्षम हो नहीं होगा। यह सरल ओवरराइडिंग नियमों का पालन करता है।

लेकिन फिर भी यदि आप someMethod पर कॉल करना चाहते हैं तो चरण निम्न है।

Fisrt रास्ता> संदर्भ चर 'date' के साथ

date.getClass().getMethod("someMethod").invoke(date);

दूसरा रास्ता>
दिनांक वर्ग के वस्तु की अनाम उप-वर्ग के नव निर्मित के साथ ।

new Date() 
{ 
    public void someMethod() { 
      System.out.println("Hello"); 
    } 
}.someMethod(); //this should be without reference 'date' 
8

:

Date date = new Date() { 

     public void someMethod() { } 

    } 

मैं अगर यह संभव है करने के लिए बाहर किसी भी तरह समान से इस विधि कॉल करने के सोच रहा हूँ विधि दिनांक एपीआई और date का हिस्सा नहीं है जहां तक ​​संकलक का संबंध है, केवल एक तारीख है।

एक ही तरीका है कि आप someMethod उपयोग कर सकते हैं सीधे नव निर्मित उदाहरण पर यह फोन करके है:

new Date() { public void someMethod() { } }.someMethod(); 
+0

हू, मुझे पता नहीं था कि आप सृजन पर एक गैर-एपीआई विधि कॉल कर सकते हैं। मुझे आश्चर्य है कि इसके लिए क्या उद्देश्य है? – iamnotmaynard

+0

@iamnotmaynard कोई उद्देश्य नहीं हो सकता है। यह सिर्फ एक अज्ञात आंतरिक वर्ग अभिव्यक्ति का प्रकार है कि आंतरिक वर्ग, जिसका नाम माता-पिता नहीं है। इसलिए यह कंपाइलर का एक मामला नहीं है ** ** आपको एआईसी के सार्वजनिक तरीकों को कॉल करने से रोकने के लिए ** भले ही वे कभी भी कहीं भी पहुंच योग्य न हों। – millimoose

+0

मैंने इसे ईमानदार होने के लिए कभी भी उपयोग नहीं किया है, लेकिन यह एक कंपाइलर के परिप्रेक्ष्य से समझ में आता है। – assylias

8

मूल रूप से कोई।

यह uglyness यह तथापि कर सकते हैं ...

Date date = new Date() { 
    public Date someMethod() { 
    //do some stuff here 
    return this; 
    } 
}.someMethod(); 

लेकिन इस के अलावा, आप केवल कि विधि (जो माता-पिता वर्ग में मौजूद नहीं है) केवल प्रतिबिंब का उपयोग कर कॉल करने के लिए इस तरह सक्षम हो जाएगा :

date.getClass().getMethod("someMethod").invoke(date); 

(कोशिश-पकड़ स्पष्टता के लिए बाहर छोड़ दिया ...)

लेकिन गंभीरता से, यह मत करो! मुझे इस कोड को लिखने वाले व्यक्ति द्वारा घृणा महसूस हो रही है, अगर मैंने इसे कोडबेस में ठोकर दिया है तो मुझे काम करना है।

1

मुझे नहीं पता कि आप ऐसा क्यों करेंगे, लेकिन जैसा लिखा है यह संभव नहीं है, क्योंकि DatesomeMethod घोषित नहीं करता है।

हालांकि आप विधि के अंदर एक स्थानीय वर्ग घोषणा कर सकते हैं, उदाहरण के लिए:

void foo () 
{ 
    class MyDate extends Date 
    { 
    public void someMethod(); 
    } 

    MyDate date = new MyDate(); 

    date.someMethod(); 
} 

एक बार फिर, मैं पहली बार एक normal वर्ग का उपयोग कर, क्योंकि स्थानीय वर्ग, उनके स्वभाव से, परीक्षण नहीं किया जा सकता है सुझाव है।

2

नहीं, यही तरीका है कि स्थानीय-कक्षाएं क्या हैं।

class MyDate extends Date() { 
    public void someMethod() {...} 
} 
MyDate date = new MyDate(); 
date.someMethod(); 
+0

यह उत्तर गलत है। – Pacerier

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