জাভা - বর্তমান শ্রেণীর নাম পাবেন?


271

আমি যা করার চেষ্টা করছি তা হ'ল বর্তমান শ্রেণীর নাম পাওয়া এবং জাভা আমার শ্রেনীর নামের শেষে একটি অকেজো অজ্ঞান $ 1 যুক্ত করে। আমি কীভাবে এ থেকে মুক্তি পাব এবং কেবল প্রকৃত শ্রেণির নামটি ফিরিয়ে দেব?

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

1
আপনি এই কোথায় ফোন করছেন? এটি কোনও বেনামে অভ্যন্তর শ্রেণীর মধ্যে থেকে? আপনি কি আরও কিছু কোড যুক্ত করতে পারেন যা ক্লাসের সংজ্ঞা এবং এই লাইনটি কোথা থেকে ডাকা হচ্ছে সে সম্পর্কে বিশদ প্রদর্শন করে?
প্লিজিম্বো

8
সুতরাং, আপনি যা চান তা হ'লString className = getClass().getName().substring(0, getClass().getName().indexOf("$"))
josh.trow

9
আপনি যদি তা পান $1তবে ক্লাসের নাম $1। আপনি যদি অন্য কিছু আশা thisকরেন তবে ভুলটির পরিবর্তে সঠিক শ্রেণিতে ব্যবহার করুন।
সিলিং

উত্তর:


247

"$ 1" "বেহুদা অজ্ঞান" নয়। যদি আপনার শ্রেণি বেনামে থাকে তবে একটি সংখ্যা যুক্ত করা হয়।

আপনি যদি ক্লাস নিজেই না চান তবে এর ঘোষিত ক্লাস, তবে আপনি ব্যবহার করতে পারেন getEnclosingClass()। উদাহরণ স্বরূপ:

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

আপনি কিছু স্থিতিশীল ইউটিলিটি পদ্ধতিতে এটি স্থানান্তর করতে পারেন।

তবে মনে রাখবেন যে এটি বর্তমান শ্রেণীর নাম নয়। বেনাম শ্রেণিটি তার বদ্ধ শ্রেণীর চেয়ে পৃথক শ্রেণি। ক্ষেত্রেটি অভ্যন্তর শ্রেণীর ক্ষেত্রে একই রকম similar


2
তবে কী হবে যদি ঘেরের ক্লাসটিও বেনামে একটি অনামী শ্রেণি হয়? আপনার ফিরে আসার আগ পর্যন্ত পুনরাবৃত্তভাবে ছিটানো ক্লাসটি পেতে হবে না nullএবং nullআপনি যে সর্বশেষ নন- ক্লাস পেয়েছেন তা ব্যবহার করবেন না ?
গ্যারেট উইলসন

231

চেষ্টা করুন,

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

এটি যতক্ষণ না আপনি এটি কোনও স্থির পদ্ধতিতে ব্যবহার না করেন ততক্ষণ কাজ করবে।


1
আসলে, এই কাজ করবে না। এই প্রশ্নটি ইঙ্গিত দেয় যে তার একটি অনামী বেনাম রয়েছে, এবং এই ক্ষেত্রে, getSimpleName () রিটার্ন দেয়""
vikingsteve

48
যদিও এটি প্রশ্নের উত্তর না দেয়, এই এসও পোস্টটি বর্তমানে গুগলে "ক্লাসের নাম জাভা পান" এর শীর্ষ ফলাফলগুলিতে রয়েছে এবং তাই এটি সম্প্রদায়ের পক্ষে এখনও সহায়ক।
এজক্যাসবার্গ

6
এটি প্যাকেজ নেমস্পেস ছাড়াই নাম ফিরিয়ে দেবে। ভাল একটা!
ওলেগ আব্রাজাইভ

31

এটি ব্যবহার করার চেষ্টা করুন this.getClass().getCanonicalName()বা this.getClass().getSimpleName()। এটি যদি কোনও বেনাম শ্রেণি থাকে তবে ব্যবহার করুনthis.getClass().getSuperclass().getName()


আসলে, এটা করে। নির্ভর করে। আপনি যদি কোনও বেনাম শ্রেণীর সাথে প্রয়োগ করছেন এমন বিমূর্ত শ্রেণির নাম পাওয়ার চেষ্টা করছেন, আপনি এটি ব্যবহার করেন।
মিররডেফেট

তার ক্ষেত্রে (বেনাম বর্গ), সাধারণ নামটি ফাঁকা, ক্যানকোনিকাল নামটি নাল এবং সুপারক্লাসটি অবজেক্ট।
বোঝো

হ্যাঁ, হ্যাঁ, না আমার প্রথম দুটি কেবল অনুমান ছিল, তৃতীয়টি অবশ্য সঠিক। বেনামে বর্গ এটি প্রয়োগ করা শ্রেণীর একটি উপশ্রেণী। এ কারণেই তারা কাজ করে। সুতরাং, সুপারক্লাসটি বিমূর্ত শ্রেণি।
মিররডেফেট

আপনি যে বর্গের উত্তরাধিকারী হচ্ছেন তা অদ্ভুত নয়? হ্যান্ডলার আমার ক্লাসে ফর্ম
উত্তোলন

উম্ম ... আমি এটি পরীক্ষা করেছি এবং আমি পেয়েছি যে বেনাম শ্রেণীর সুপারক্লাসটি বিমূর্ত শ্রেণি। আমি আমার যুক্তিটি আবার যাচাই করব ... তবে আমি যে ফলাফলটি বোধগম্য হতে চলেছি, আমি মনে করি না যে এটিই আমিই ভুল করেছি ....
মিররফেট

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.this.getClass().getName()

2

আপনার উদাহরণে thisসম্ভবত একটি বেনাম শ্রেণীর উদাহরণকে বোঝায়। জাভা $numberএনকোলেসিং ক্লাসের নাম যুক্ত করে সেই ক্লাসগুলিতে একটি নাম দেয় ।


2
অজ্ঞাতনামা অন্দর শ্রেণীর নাম রাখা হয়েছে আউটার $ ইনার। এটি একটি বেনাম শ্রেণি হবে।
ডানকান ম্যাকগ্রিগোর

1

আমি ধরে নিচ্ছি এটি একটি বেনাম শ্রেণীর জন্য ঘটছে। যখন আপনি একটি বেনাম শ্রেণি তৈরি করেন আপনি প্রকৃতপক্ষে এমন একটি শ্রেণি তৈরি করেন যা আপনার নামটি পেয়েছিল এমন ক্লাসটি প্রসারিত করে।

আপনি যে নামটি চান তা পাওয়ার "ক্লিনার" উপায়টি হ'ল:

যদি আপনার ক্লাসটি কোনও বেনামে অভ্যন্তর শ্রেণি হয় getSuperClass()তবে এটি আপনাকে তৈরি করা ক্লাসটি দেবে। আপনি যদি এটিকে কোনও এসএল এর থেকে বাছাই করার চেয়ে কোনও ইন্টারফেস থেকে তৈরি করেন কারণ আপনি সবচেয়ে ভাল করতে পারেন getInterfaces()যা আপনাকে একাধিক ইন্টারফেস দিতে পারে।

"হ্যাকি" উপায়টি হ'ল নামটি সরাতে নামটি ছোঁড়াতে একটি রেজেেক্স getClassName()ব্যবহার করা $1


0

এখানে একটি অ্যান্ড্রয়েড বৈকল্পিক, তবে একই নীতিটি সরল জাভাতেও ব্যবহার করা যেতে পারে।

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
আপনি কি জানেন যে আপনি আপনার উত্তরটি মোট কোডের একক চিহ্ন হিসাবে পোস্ট করেছেন? বিবৃতিগুলি কোডের উদ্ধৃতি হিসাবে ফর্ম্যাট করা উচিত নয় ...
ম্যাসিমিলিয়ানো ক্রাউস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.