Java-現在のクラス名を取得しますか?


271

私がしようとしているのは、現在のクラス名を取得することだけであり、javaは私のクラス名の最後に無意味な意味のない$ 1を追加します。それを削除して実際のクラス名のみを返すにはどうすればよいですか?

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

1
どこに電話したの?匿名の内部クラスからですか?クラスの定義とこの行がどこから呼び出されているかについての詳細を示すコードをさらに追加できますか?
plainjimbo 2011年

8
したがって、必要なのはString className = getClass().getName().substring(0, getClass().getName().indexOf("$"))
josh.trow

9
それなら$1、クラスの名前はなので$1。他のことが予想される場合thisは、間違ったクラスではなく、正しいクラスで使用してください。
2014

回答:


247

「$ 1」は「無意味な無意味」ではありません。クラスが匿名の場合は、番号が追加されます。

クラス自体ではなく、宣言クラスが必要な場合は、を使用できますgetEnclosingClass()。例えば:

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

静的なユーティリティメソッドで移動できます。

ただし、これは現在のクラス名ではないことに注意してください。匿名クラスは、それを囲むクラスとは異なります。内部クラスの場合も同様です。


2
しかし、囲んでいるクラスも匿名の内部クラスである場合はどうなりますか?それが戻るまで再帰的に包含クラスを取得しnull、最後にnull取得した非クラスを使用する必要はありませんか?
Garret Wilson

231

試して、

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

これは、静的メソッドで使用しない限り機能します。


1
実際には、これは機能しません。この質問は、彼が匿名の内部クラスを持っていることを示しています。この場合、getSimpleName()が返されます""
vikingsteve

48
これは質問の答えにはなりませんが、このSO投稿は現在、Googleでの「get class name java」の上位の検索結果に含まれているため、コミュニティーに役立ちます。
EdgeCaseBerg 2014年

6
パッケージの名前空間なしで名前を返します。いいね!
Oleg Abrazhaev 16年

31

これを使用してみてください this.getClass().getCanonicalName()this.getClass().getSimpleName()。匿名クラスの場合は、this.getClass().getSuperclass().getName()


実際にはそうです。依存します。匿名クラスで実装している抽象クラスの名前を取得しようとしている場合は、これを使用します。
MirroredFate

彼の場合(匿名クラス)、単純な名前は空、canconical名はnull、スーパークラスはObjectです。
Bozho

はい、はい、いいえ。最初の2つは推測でしたが、3つ目は正しいです。匿名クラスは、それが実装するクラスのサブクラスです。それが彼らが機能する理由です。したがって、スーパークラスは抽象クラスです。
MirroredFate 2011年

奇妙なのは、スーパークラスが継承元のクラスではないですか。ハンドラーは私のクラスを継承していません。それは単なるメンバーです
aryaxt

うーん...私はこれをテストしましたが、匿名クラスのスーパークラスが抽象クラスであることがわかりました。私は自分のロジックを再確認します...しかし、意味のある結果を得ているので、間違いを犯したのは私ではないと思います
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おそらく匿名クラスのインスタンスを参照しています。Javaは$number、外側のクラスの名前にa を追加することにより、これらのクラスに名前を付けます。


2
非匿名の内部クラスは、Outer $ Innerという名前です。これは匿名クラスになります。
ダンカンマクレガー2011年

1

これは匿名クラスで起こっていると思います。匿名クラスを作成すると、実際には、名前を取得したクラスを拡張するクラスが作成されます。

希望する名前を取得する「よりクリーンな」方法は次のとおりです。

クラスが匿名の内部クラスでgetSuperClass()ある場合は、作成元のクラスを提供する必要があります。インターフェースから作成した場合は、SOLのようなものではgetInterfaces()ありません。できることは、複数のインターフェースを提供できることです。

「ハック」な方法は、名前を取得しgetClassName()、正規表現を使用してをドロップすること$1です。


0

これはAndroidのバリアントですが、同じ原理をプレーンJavaでも使用できます。

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

-3

これは私のコードで機能することがわかりましたが、私のコードはforループ内の配列からクラスを取得しています。

String className="";

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

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

これは、他の回答のいずれかがまだ言っていないことを何も追加しません。ループ/配列全体の問題は関係ありません。また、コードのフォーマットが質問/回答でどのように機能するかを調べる必要があります。
Jonathon Reinhart、2014年

-4

リフレクションAPI

クラスを返すリフレクションAPIはいくつかありますが、これらは直接または間接的にクラスが既に取得されている場合にのみアクセスできます。

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();

Characterには、Character.Subsetと
Character.UnicodeBlockの2つのメンバークラスが含まれています。

        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
回答を完全な一体型のコードブロックとして投稿したことをご存知ですか?ステートメントは、コードの引用符としてフォーマットしないでください...
Massimiliano Kraus
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.