web-dev-qa-db-ja.com

Java - 現在のクラス名を取得する?

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

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

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

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

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

あなたはそれを何らかの静的な効用方法で動かすことができます。

しかし、これは現在のクラス名ではありません。無名クラスは、それを囲むクラスとは異なるクラスです。ケースは内部クラスでも同様です。

226
Bozho

やってみる

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

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

194
jesg

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

27
MirroredFate

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();
    }
}
9
Karuna

両方の答えの組み合わせ。メソッド名も表示します。

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

この答えは遅れていますが、無名ハンドラークラスのコンテキストでこれを実行する別の方法があると思います。

まあ言ってみれば:

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

同じ結果が得られます。さらに、すべてのクラスはコンパイル時に定義されるため、実際には非常に便利であり、動的性が損なわれることはありません。

その上で、クラスが本当にネストされている、すなわちAが実際にBで囲まれている場合、Bのクラスは次のように簡単に知ることができます。

B.this.getClass().getName()
3
Jason Hu

あなたの例では、thisはおそらく匿名クラスインスタンスを参照します。 Javaは、それを囲むクラスの名前に$numberを追加することによってそれらのクラスに名前を付けます。

2
tonio

私はこれが匿名クラスのために起こっていると思います。無名クラスを作成するときには、実際には名前を付けたクラスを拡張するクラスを作成します。

あなたが欲しい名前を得るための「よりきれいな」方法は、次のとおりです。

あなたのクラスが匿名の内部クラスであれば、getSuperClass()はそれが作られたクラスをあなたに与えるべきです。あなたがそれをあなたがSOLのようなものではないインターフェースから作成したならば、あなたがすることができる最善はgetInterfaces()であり、それはあなたに複数のインターフェースを与えるかもしれません。

"厄介な"方法は、単にgetClassName()で名前を取得し、正規表現を使って$1を削除することです。

1
trutheality