जावा - वर्तमान वर्ग का नाम मिलता है?


271

मैं केवल यही कोशिश कर रहा हूं कि मुझे वर्तमान वर्ग का नाम मिल जाए, और जावा मेरी कक्षा के नाम के अंत में एक बेकार गैर-अर्थ $ 1 जोड़ देता है । मैं इससे कैसे छुटकारा पा सकता हूं और केवल वास्तविक वर्ग का नाम वापस कर सकता हूं?

String className = this.getClass().getName();

1
आप इसे कहां बुला रहे हैं? क्या यह एक अनाम आंतरिक वर्ग के भीतर से है? क्या आप कुछ और कोड जोड़ सकते हैं जो वर्ग की परिभाषा के बारे में विवरण दिखाता है और इस पंक्ति को कहां से बुलाया जा रहा है?
सादेजिमो

8
तो, आप सभी चाहते हैंString className = getClass().getName().substring(0, getClass().getName().indexOf("$"))
josh.trow

9
अगर आपको मिलता है $1, क्योंकि वर्ग का नाम है $1। यदि आप कुछ और उम्मीद करते हैं, thisतो गलत के बजाय सही वर्ग में उपयोग करें ।
13

जवाबों:


247

"$ 1" "बेकार गैर-अर्थ" नहीं है। यदि आपकी कक्षा अनाम है, तो एक नंबर जोड़ा जाता है।

यदि आप स्वयं कक्षा नहीं चाहते हैं, लेकिन इसका घोषित वर्ग है, तो आप इसका उपयोग कर सकते हैं getEnclosingClass()। उदाहरण के लिए:

Class<?> enclosingClass = getClass().getEnclosingClass();
if (enclosingClass != null) {
  System.out.println(enclosingClass.getName());
} else {
  System.out.println(getClass().getName());
}

आप इसे कुछ स्थैतिक उपयोगिता विधि में स्थानांतरित कर सकते हैं।

लेकिन ध्यान दें कि यह वर्तमान वर्ग का नाम नहीं है। अनाम वर्ग अपने संलग्न वर्ग से अलग वर्ग है। मामला आंतरिक वर्गों के लिए समान है।


2
लेकिन क्या होगा अगर संलग्न वर्ग भी एक अनाम आंतरिक वर्ग है? जब तक आप वापस नहीं आते तब तक आपको पुनरावृत्ति वर्ग प्राप्त करने की आवश्यकता नहीं है null, और nullआपके द्वारा प्राप्त अंतिम गैर- वर्ग का उपयोग करें ?
गैरेट विल्सन

231

प्रयत्न,

String className = this.getClass().getSimpleName();

यह तब तक काम करेगा जब तक आप इसे स्टैटिक तरीके से इस्तेमाल नहीं करते।


1
वास्तव में, नहीं, यह काम नहीं करेगा। यह प्रश्न इंगित करता है कि उसके पास एक अनाम आंतरिक वर्ग है, और इस मामले के लिए, getSimpleName () रिटर्न""
vikingsteve

48
भले ही यह सवाल का जवाब नहीं देता है, यह एसओ पोस्ट वर्तमान में Google पर "क्लास नाम जावा" पाने के लिए शीर्ष परिणामों में है, और इसलिए यह अभी भी समुदाय के लिए उपयोगी है।
एजकेशबर्ग

6
यह पैकेज नेमस्पेस के बिना नाम लौटाएगा। अच्छा था!
ओलेग अब्राजेव

31

यह प्रयोग करके देखें this.getClass().getCanonicalName()या this.getClass().getSimpleName()। यदि यह एक अनाम वर्ग है, तो उपयोग करेंthis.getClass().getSuperclass().getName()


वास्तव में, यह करता है। निर्भर करता है। यदि आप एक अनाम वर्ग के साथ लागू होने वाले अमूर्त वर्ग का नाम लेने की कोशिश कर रहे हैं, तो यह वह है जो आप उपयोग करते हैं।
मिररफाइंड

उनके मामले (अनाम वर्ग) के लिए, सरल नाम खाली है, कैनकनिकल नाम शून्य है और सुपरक्लास ऑब्जेक्ट है।
21

हाँ, हाँ, नहीं। मेरे पहले दो सिर्फ अनुमान थे, तीसरा, हालांकि, सही है। एक अनाम वर्ग उस कक्षा का एक उपवर्ग होता है जिसे वह लागू करता है। इसलिए वे काम करते हैं। इस प्रकार, सुपरक्लास अमूर्त वर्ग है।
MirroredFate

अजीब वह सुपर क्लास नहीं है जिस वर्ग से आप विरासत में मिले हैं? हैंडलर
इनहेरिट

उम्म ... मैंने इसका परीक्षण किया है, और मुझे पता है कि अनाम वर्ग का सुपरक्लास अमूर्त वर्ग है। मैं अपने तर्क की पुनरावृत्ति करूंगा ... लेकिन जैसा कि मुझे यह परिणाम मिल रहा है जो समझ में आता है, मुझे नहीं लगता कि यह मुझसे है जिसने गलती की है ....
दर्पण

10

आप का उपयोग कर सकते हैं this.getClass().getSimpleName(), जैसे:

import java.lang.reflect.Field;

public class Test {

    int x;
    int y;  

    public void getClassName() {
        String className = this.getClass().getSimpleName(); 
        System.out.println("Name:" + className);
    }

    public void getAttributes() {
        Field[] attributes = this.getClass().getDeclaredFields();   
        for(int i = 0; i < attributes.length; i++) {
            System.out.println("Declared Fields" + attributes[i]);    
        }
    }

    public static void main(String args[]) {

        Test t = new Test();
        t.getClassName();
        t.getAttributes();
    }
}

4

दोनों उत्तरों का संयोजन। एक विधि नाम भी प्रिंट करता है:

Class thisClass = new Object(){}.getClass();
String className = thisClass.getEnclosingClass().getSimpleName();
String methodName = thisClass.getEnclosingMethod().getName();
Log.d("app", className + ":" + methodName);

3

यह उत्तर देर से आता है, लेकिन मुझे लगता है कि अनाम हैंडलर क्लास के संदर्भ में ऐसा करने का एक और तरीका है।

हम कहते हैं:

class A {
    void foo() {
        obj.addHandler(new Handler() {
            void bar() {
                String className=A.this.getClass().getName();
                // ...
            }
        });
    }
}

यह उसी परिणाम को प्राप्त करेगा। इसके अलावा, यह वास्तव में काफी सुविधा है क्योंकि प्रत्येक वर्ग को संकलन समय पर परिभाषित किया गया है, इसलिए कोई भी गतिशीलता क्षतिग्रस्त नहीं है।

इसके बाद, यदि वर्ग Aवास्तव में निहित है , अर्थात वास्तव में संलग्न है B, तो B के वर्ग को आसानी से जाना जा सकता है:

B.this.getClass().getName()

2

अपने उदाहरण में, thisशायद एक अनाम वर्ग उदाहरण को संदर्भित करता है। जावा उन वर्गों को एक नाम देता है $number, जिन्हें संलग्न करने वाले वर्ग के नाम से जोड़ा जाता है।


2
गैर-अनाम आंतरिक वर्गों को बाहरी $ आंतरिक नाम दिया गया है। यह एक अनाम वर्ग होगा।
डंकन मैकग्रेगर

1

मैं मान रहा हूं कि यह एक अनाम वर्ग के लिए हो रहा है। जब आप एक अनाम वर्ग बनाते हैं तो आप वास्तव में एक वर्ग बनाते हैं जो उस वर्ग का विस्तार करता है जिसका नाम आपको मिला है।

"क्लीनर" रास्ता आप चाहते हैं नाम पाने के लिए है:

यदि आपकी कक्षा एक अनाम आंतरिक वर्ग है, getSuperClass()तो आपको उस कक्षा को देना चाहिए जो इसे बनाया गया था। यदि आपने इसे SOL से अलग किया है, तो आप इसे एक तरह से बना सकते हैं क्योंकि सबसे अच्छा आप वह कर सकते हैं getInterfaces()जो आपको एक से अधिक इंटरफ़ेस दे सकता है।

"हैकी" तरीका सिर्फ नाम पाने के लिए है getClassName()और ड्रॉप करने के लिए एक regex का उपयोग करना है $1


0

यहाँ एक Android संस्करण है, लेकिन उसी सिद्धांत का उपयोग सादे जावा में भी किया जा सकता है।

private static final String TAG = YourClass.class.getSimpleName();
private static final String TAG = YourClass.class.getName();

-3

मैंने इसे अपने कोड के लिए काम करने के लिए पाया है, हालांकि, मेरे कोड को लूप के लिए एक सरणी के बाहर कक्षा मिल रही है।

String className="";

className = list[i].getClass().getCanonicalName();

System.out.print(className); //Use this to test it works

इसमें ऐसा कुछ भी नहीं जोड़ा गया है जो किसी भी अन्य उत्तर ने पहले ही नहीं कहा है। संपूर्ण लूप / सरणी समस्या अप्रासंगिक है। साथ ही, आपको यह देखना चाहिए कि प्रश्न / उत्तर पर कोड स्वरूपण कैसे काम करता है।
जोनाथन रेनहार्ट

-4

परावर्तन एपीआई

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

Class.getSuperclass()
     Returns the super class for the given class.

        Class c = javax.swing.JButton.class.getSuperclass();
        The super class of javax.swing.JButton is javax.swing.AbstractButton.

        Class.getClasses()

सभी सार्वजनिक वर्गों, इंटरफेस और एनमों को लौटाता है जो विरासत में प्राप्त सदस्यों सहित वर्ग के सदस्य हैं।

        Class<?>[] c = Character.class.getClasses();

चरित्र में दो सदस्य वर्ग होते हैं

        Class.getDeclaredClasses()
         Returns all of the classes interfaces, and enums that are explicitly declared in this class.

        Class<?>[] c = Character.class.getDeclaredClasses();
     Character contains two public member classes Character.Subset and Character.UnicodeBlock and one private class

Character.CharacterCache।

        Class.getDeclaringClass()
        java.lang.reflect.Field.getDeclaringClass()
        java.lang.reflect.Method.getDeclaringClass()
        java.lang.reflect.Constructor.getDeclaringClass()
     Returns the Class in which these members were declared. Anonymous Class Declarations will not have a declaring class but will

एक संलग्न वर्ग है।

        import java.lang.reflect.Field;

            Field f = System.class.getField("out");
            Class c = f.getDeclaringClass();
            The field out is declared in System.
            public class MyClass {
                static Object o = new Object() {
                    public void m() {} 
                };
                static Class<c> = o.getClass().getEnclosingClass();
            }

     The declaring class of the anonymous class defined by o is null.

    Class.getEnclosingClass()
     Returns the immediately enclosing class of the class.

    Class c = Thread.State.class().getEnclosingClass();
     The enclosing class of the enum Thread.State is Thread.

    public class MyClass {
        static Object o = new Object() { 
            public void m() {} 
        };
        static Class<c> = o.getClass().getEnclosingClass();
    }
     The anonymous class defined by o is enclosed by MyClass.

2
क्या आप जानते हैं कि आपने अपना उत्तर कोड के कुल अखंड ब्लॉक के रूप में पोस्ट किया है? कथनों को कोड कोट्स के रूप में प्रारूपित नहीं किया जाना चाहिए ...
मासिमिलियानो क्रूस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.