2011-01-16 9 views
10

जावा के संदर्भ में, मैं सांख्यिकीय रूप से को वर्तमान क्लास के क्लास नाम को जानना चाहता हूं। ए बी का मूल वर्ग है। मैं ए (पैरेंट क्लास) में एक स्थिर स्ट्रिंग रखना चाहता हूं जिसमें वर्तमान वर्ग का वर्ग नाम शामिल है, लेकिन जब इस स्थैतिक स्ट्रिंग को बी (बाल वर्ग) में संदर्भित किया जाता है, तो इसमें होना चाहिए बी का वर्ग का नाम। क्या यह संभव है?जावा: क्या अभिभावक वर्ग सांख्यिकीय रूप से बाल वर्ग के वर्ग का नाम पुनर्प्राप्त कर सकता है?

उदाहरण:

public class Parent { 

protected static String MY_CLASS_NAME = ??? 
. 
. 
. 
} 

public class Child extends Parent { 

public void testMethod() { 
    if (MY_CLASS_NAME.equals(getClass().getName())) { 
     System.out.println("We're equal!"); 
    } 
} 

} 
+0

क्यों आप क्या करेंगे कर इस कोड की कोशिश है कि आप अन्य तरीकों से वर्ग के नाम प्राप्त कर सकते हैं के रूप में? –

+0

आपको इसके लिए क्या चाहिए? –

+2

मैंने कभी-कभी कामना की है कि यह भी संभव था। लेकिन यह नहीं है। 'स्थिर' शब्द का अर्थ पहले से ही है कि एक सदस्य/विधि, आदि * स्थिर रूप से * उस वर्ग से जुड़ा हुआ है जो इसे रखता है। आप इसे ओवरराइड नहीं कर सकते - जैसे कि लिंकिंग किया जाता है * गतिशील रूप से * उदाहरण के लिए सदस्यों/विधियों –

उत्तर

9

मुझे पता है कि एकमात्र तरीका निम्न है: संरक्षित कन्स्ट्रक्टर बनाएं जो मूल वर्ग में स्ट्रिंग स्वीकार करता है।

class Parent { 
    private final String className; 
    protected Parent(String className) { 
     this.className = className; 
    } 
} 

public class Child extends Parent { 
    public Child() { 
     super("Child"); 
    } 
} 

BTW आप भी इस new Throwable().getStackTrace() कोष्ठक के custructor में उपयोग में सुधार कर सकते हैं। इस मामले में आपको सभी बच्चों को अपना नाम माता-पिता को पास करने के लिए भी लागू नहीं करना पड़ता है।

class Parent { 
    private final String className; 
    protected Parent() { 
     StackTraceElement[] trace = new Throwable().getStackTrace(); 
     this.className = trace[1].getClassName(); 
    } 
} 
+0

ओह, वह गंध की गंध करता है! 'ट्रेस [1] .getClassName();' ... अच्छा विचार हालांकि :) –

+1

यदि आप इस हैकी दिशा को वैसे भी जाना चाहते हैं, तो मैं 'थ्रेड # getStackTrace()' का उपयोग करता हूं क्योंकि यह आपको अनावश्यक और अपेक्षाकृत से बचाता है अपवाद और स्टैकट्रैक के क्लोनिंग का महंगा निर्माण। एक तर्क लेने वाला एक अमूर्त कन्स्ट्रक्टर प्रदान करना आईएमओ जाने का तरीका है। – BalusC

+0

@ बालससी: अमूर्त कन्स्ट्रक्टर का नुकसान यह है कि प्रत्येक उदाहरण में स्ट्रिंग की एक प्रति होती है - जो स्थिर क्षेत्र की तुलना में स्मृति की बर्बादी है। –

4

नहीं, यह संभव नहीं है। स्थिर स्ट्रिंग (प्रति क्लासलोडर) की केवल एक प्रति है, लेकिन आपके पास एकाधिक उप-वर्ग हो सकते हैं।

आप फिर भी प्रति (उप) वर्ग एक स्थिर क्षेत्र हो सकता है, और फिर एक विधि का उपयोग

public class Child extends Parent { 
    private static final String NAME = "some alias"; 

    @Override 
    public String getName() { 
     return NAME; 
    } 
} 

यह एक तकनीक है कि प्रतिबिंब (नाम तो अक्सर बराबर नहीं है से बचने के लिए इस्तेमाल किया जा सकता है वर्ग का नाम, लेकिन कुछ उपनामों का उपयोग करता है - इसका उपयोग स्ट्रिंग्स के बजाय enums के साथ भी किया जा सकता है)।

+0

धन्यवाद बहुत आदमी :) केवल चीजें मुझे packagename.class मिलती है जो कोई मुद्दा नहीं है लेकिन यह बहुत उपयोगी था – HkFreaKuser1673718

1

यद्यपि आप स्थिर चर का उपयोग कर

class Parent{ 
    final String className; 
    public Parent(){ 
    className=this.getClass().getName(); 
    } 
    } 

यह नहीं कर सका और जो आवश्यक उपवर्गों के लिए

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