2013-01-22 16 views
8

2 वर्गों है, का उपयोग करते हुए तरीकों का कहना है कि एक & बी:आह्वान सुपर वर्ग प्रतिबिंब

Class A extends B { 
    public void subClassMthd(){ 
     System.out.println("Hello"); 
    } 
} 

Class B { 
    public void printHelloWorld { 
     System.out.println("Hello"); 
    } 
} 

अब, मैं प्रतिबिंब का उपयोग कर रहा क्लास ए पर विधियां प्रारंभ करने मैं भी printHelloWorld विधि वर्तमान आह्वान करने के लिए चाहते हैं कक्षा बी में

मैं

Class clazz = Class.forName("com.test.ClassA"); 
Object classAInstance= clazz.newInstance(); 
Method superClassmthd = classAInstance.getClass() 
    .getSuperclass().getMethod("printHelloWorld", null); 
superClassmthd.invoke(classAInstance); 

इसके अलावा

के रूप में करने की कोशिश की उपयोग करने की कोशिश 0
Class clazz = Class.forName("com.test.ClassA"); 
Object classAInstance= clazz.newInstance(); 
Class superClazz = Class.forName(classAInstance.getClass().getSuperclass().getName()); 
Object superclassInstance = superClazz.newInstance(); 
Method superClassmthd = superclassInstance.getMethod("printHelloWorld", null); 
superClassmthd.invoke(superclassInstance); 

लेकिन उनमें से कोई भी काम नहीं करता; उन्होंने InstantiationException फेंक दिया।

मैं यहाँ क्या गलत कर रहा हूं?

+0

यह स्पष्ट नहीं है तुम क्या करने की कोशिश कर रहे हैं क्योंकि वास्तव में क्या कोड आप प्रदान किया है कोई मतलब नहीं है। क्या आप जो कुछ करने की कोशिश कर रहे हैं उस पर अधिक जानकारी दे सकते हैं? –

+0

जब आप नियमित तरीकों का आह्वान करते हैं, तो कक्षा के नए उदाहरण को बनाने का प्रयास करते समय एक इंस्टेंटेशन अपवाद फेंक दिया जा सकता है। क्या आप वाकई समस्या को हल करने के लिए सही जगह पर देख रहे हैं? – jarnbjo

+0

क्या आप एक्सेप्शन स्टैकट्रैस और कक्षा बी में विधि से कोड प्रदान कर सकते हैं (और यदि यह मौजूद है) कक्षा ए से अतिरंजित और/या अधिभारित विधियां प्रदान कर सकते हैं? विधि 'हस्ताक्षर पर्याप्त हैं- पूर्ण आंतरिक विधि कोड की आवश्यकता नहीं है। –

उत्तर

15

इस प्रयास करें:

Method mthd = classAInstance.getClass().getSuperclass().getDeclaredMethod("XYZ"); 
mthd.invoke(classAInstance) 

अंतर getDeclaredMethod(), जो सभी दृश्यताएं (public, protected, पैकेज/डिफ़ॉल्ट और private) के बजाय getMethod() है, जो केवल public दृश्यता के साथ तरीकों हो जाता है के तरीके हो जाता है उपयोग कर रहा है ।

+0

धन्यवाद, यह – Vivek

+0

काम करता है यह क्लासएन्स्टेंस की XYZ विधि को कॉल करेगा। मैंने अभी इसका परीक्षण किया और यह केवल क्लासएन्स्टेंस के सुपर.एक्सवाईजेड() को कॉल नहीं किया। –

+2

@ user951793 अगर सुपर विधि उदाहरण के वर्ग (इस प्रश्न की स्थिति नहीं) द्वारा ओवरराइड की जाती है, तो निश्चित रूप से ओवरराइड विधि लागू की जाएगी - यह व्यवहार ओओपी का मूल है। – Bohemian

2

उन विधियों की दृश्यता क्या है जिन्हें आप कॉल करना चाहते हैं (सार्वजनिक, निजी आदि)। यदि आप उन विधियों को देखना चाहते हैं जिन्हें आप सीधे कॉल नहीं कर सकते हैं, तो आपको getDeclaredMethod() का उपयोग करना चाहिए।

इसके अलावा, आपके वर्गों के निर्माता क्या हैं? InstantiationException इंगित करता है कि आपको कक्षा ए (या बी) का उदाहरण प्राप्त करने में समस्या हो रही है।

मैं निम्नलिखित कोड है और यह काम करता है:

A.java

import java.lang.reflect.Method; 

public class A extends B { 

    public static void main(String[] args) throws Exception { 
     A classAInstance = new A(); 
     Method mthd = classAInstance.getClass().getSuperclass().getMethod("XYZ", null); 
     mthd.invoke(classAInstance); 
    } 

} 

B.java

public class B { 

    public void XYZ() { 
     System.out.println("done"); 
    } 

} 
+0

धन्यवाद, यह टिप भी मेरे लिए काम किया। – Vivek

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