से नई परिभाषित विधि को कॉल करना मैंने एक अज्ञात वर्ग की ऑब्जेक्ट को तुरंत चालू किया जिसमें मैंने एक नई विधि जोड़ दी। प्रतिबिंब आप नहीं कर सकते का उपयोग किए बिनाअज्ञात वर्ग
date.someMethod();
से नई परिभाषित विधि को कॉल करना मैंने एक अज्ञात वर्ग की ऑब्जेक्ट को तुरंत चालू किया जिसमें मैंने एक नई विधि जोड़ दी। प्रतिबिंब आप नहीं कर सकते का उपयोग किए बिनाअज्ञात वर्ग
date.someMethod();
अच्छा सवाल। उत्तर नहीं है। आप सीधे 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'
:
Date date = new Date() {
public void someMethod() { }
}
मैं अगर यह संभव है करने के लिए बाहर किसी भी तरह समान से इस विधि कॉल करने के सोच रहा हूँ विधि दिनांक एपीआई और date
का हिस्सा नहीं है जहां तक संकलक का संबंध है, केवल एक तारीख है।
एक ही तरीका है कि आप someMethod
उपयोग कर सकते हैं सीधे नव निर्मित उदाहरण पर यह फोन करके है:
new Date() { public void someMethod() { } }.someMethod();
हू, मुझे पता नहीं था कि आप सृजन पर एक गैर-एपीआई विधि कॉल कर सकते हैं। मुझे आश्चर्य है कि इसके लिए क्या उद्देश्य है? – iamnotmaynard
@iamnotmaynard कोई उद्देश्य नहीं हो सकता है। यह सिर्फ एक अज्ञात आंतरिक वर्ग अभिव्यक्ति का प्रकार है कि आंतरिक वर्ग, जिसका नाम माता-पिता नहीं है। इसलिए यह कंपाइलर का एक मामला नहीं है ** ** आपको एआईसी के सार्वजनिक तरीकों को कॉल करने से रोकने के लिए ** भले ही वे कभी भी कहीं भी पहुंच योग्य न हों। – millimoose
मैंने इसे ईमानदार होने के लिए कभी भी उपयोग नहीं किया है, लेकिन यह एक कंपाइलर के परिप्रेक्ष्य से समझ में आता है। – assylias
मूल रूप से कोई।
यह uglyness यह तथापि कर सकते हैं ...
Date date = new Date() {
public Date someMethod() {
//do some stuff here
return this;
}
}.someMethod();
लेकिन इस के अलावा, आप केवल कि विधि (जो माता-पिता वर्ग में मौजूद नहीं है) केवल प्रतिबिंब का उपयोग कर कॉल करने के लिए इस तरह सक्षम हो जाएगा :
date.getClass().getMethod("someMethod").invoke(date);
(कोशिश-पकड़ स्पष्टता के लिए बाहर छोड़ दिया ...)
लेकिन गंभीरता से, यह मत करो! मुझे इस कोड को लिखने वाले व्यक्ति द्वारा घृणा महसूस हो रही है, अगर मैंने इसे कोडबेस में ठोकर दिया है तो मुझे काम करना है।
मुझे नहीं पता कि आप ऐसा क्यों करेंगे, लेकिन जैसा लिखा है यह संभव नहीं है, क्योंकि Date
someMethod
घोषित नहीं करता है।
हालांकि आप विधि के अंदर एक स्थानीय वर्ग घोषणा कर सकते हैं, उदाहरण के लिए:
void foo ()
{
class MyDate extends Date
{
public void someMethod();
}
MyDate date = new MyDate();
date.someMethod();
}
एक बार फिर, मैं पहली बार एक normal
वर्ग का उपयोग कर, क्योंकि स्थानीय वर्ग, उनके स्वभाव से, परीक्षण नहीं किया जा सकता है सुझाव है।
नहीं, यही तरीका है कि स्थानीय-कक्षाएं क्या हैं।
class MyDate extends Date() {
public void someMethod() {...}
}
MyDate date = new MyDate();
date.someMethod();
यह उत्तर गलत है। – Pacerier
आप इसे क्यों नहीं देखते हैं और देखते हैं कि यह संकलित और चलाता है या नहीं? – Claudiu
अज्ञात वर्ग का उपयोग क्यों करें - इसके लिए आपकी प्रेरणा क्या है? वास्तव में यह एक ऐसी स्थिति है जहां ** ** अज्ञात वर्गों का उपयोग नहीं करना सर्वोत्तम है। –
आप शायद इसे प्रतिबिंब के साथ कर सकते हैं, लेकिन शायद आप नहीं चाहते ... – Lucas