getConstructor जावा में NoSuchMethodException फेंकता है

Oct 15 2020

मैं जावा के लिए बहुत नया हूं इसलिए यह एक गूंगा प्रश्न हो सकता है, लेकिन मैं यह समझने की कोशिश कर रहा हूं कि मौजूदा उदाहरण से कक्षा प्राप्त करके कक्षा का नया उदाहरण कैसे बनाया जाए (मुझे लगता है कि इसे प्रतिबिंब कहा जाता है)।

वर्तमान में मेरे पास एक सुपर क्लास और इसके कई उपवर्ग हैं।

public abstract class SuperClazz {...}

public class SubClazz1 extends SuperClazz {...}

public class SubClazz2 extends SuperClazz {...}

मेरे पास इन उपवर्गों में से एक का एक मौजूदा उदाहरण है (केवल सुपर क्लास के सदस्य के रूप में घोषित किया गया है, क्योंकि मुझे अभी तक नहीं पता है कि यह किस उपवर्ग का है)। मैं कोशिश कर रहा हूँ कि जो भी इस मौजूदा उदाहरण का उप-वर्ग प्राप्त करे और उसी उपवर्ग का एक नया उदाहरण बनाये।

यह मेरा सेटअप है:

private SuperClazz oldSubInstance;
private SuperClazz newSubInstance;

newSubInstance = oldSubInstance.getClass().getConstructor(String.class, char.class, int.class).newInstance("abc", 'e', 6);

जो NoSuchMethodException को फेंकता है।

मैं भ्रमित हूं क्योंकि मुझे पता है कि SuperClazz का एक निर्माता है जो तीन मापदंडों, एक स्ट्रिंग, एक चार और एक इंट में लेता है। मैंने यहाँ और यहाँ उत्तर देखे हैं, लेकिन पाया है कि सुझाए गए फ़िक्स को लागू करने से काम नहीं चलता है, या यह कि उनके मुद्दे मेरी स्थिति पर लागू नहीं होते हैं।

क्या मैं पूरी तरह से गलतफहमी में हूं कि गेटकंस्ट्रक्टर कैसे काम करता है?

जवाब

AlexRudenko Oct 15 2020 at 20:04

आपको यह सुनिश्चित करने की आवश्यकता है कि ऑल-आर्ग्स कंस्ट्रक्टर बच्चों की कक्षा में मौजूद है।

निम्न उदाहरण बनाता है newSubInstance:

// using Lombok annotations for brevity
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@ToString
abstract class SuperClazz {
    private String str;
    private char chr;
    private int x;

    // getters/setters/default and all-args constructors provided by Lombok
}


class SubClazz1 extends SuperClazz {
    public SubClazz1(String str, char c, int i) { // providing constructor in the child class
        super(str, c, i);
    }
}

// test
SuperClazz oldSubInstance = new SubClazz1("def", 'g', 10);
SuperClazz newSubInstance;

newSubInstance = oldSubInstance.getClass()
                               .getConstructor(String.class, char.class, int.class)
                               .newInstance("abc", 'e', 6);

System.out.println(newSubInstance);

आउटपुट ( toStringबेस क्लास स्तर पर ओवरराइड):

SuperClazz(str=abc, chr=e, x=6)