私がやろうとしているのは、現在のクラス名を取得することだけです。Javaは、無駄な無意味な $ 1 を私のクラス名の最後に追加します。どうすればそれを取り除き、実際のクラス名だけを返すことができますか?
String className = this.getClass().getName();
「$ 1」は「無駄な無意味」ではありません。クラスが匿名の場合は、番号が追加されます。
クラス自体ではなく宣言クラスが必要な場合は、getEnclosingClass()
を使用できます。例えば:
Class<?> enclosingClass = getClass().getEnclosingClass();
if (enclosingClass != null) {
System.out.println(enclosingClass.getName());
} else {
System.out.println(getClass().getName());
}
あなたはそれを何らかの静的な効用方法で動かすことができます。
しかし、これは現在のクラス名ではありません。無名クラスは、それを囲むクラスとは異なるクラスです。ケースは内部クラスでも同様です。
やってみる
String className = this.getClass().getSimpleName();
静的メソッドで使用しない限り、これは機能します。
このthis.getClass().getCanonicalName()
またはthis.getClass().getSimpleName()
を使ってみてください。無名クラスの場合はthis.getClass().getSuperclass().getName()
を使用してください。
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();
}
}
両方の答えの組み合わせ。メソッド名も表示します。
Class thisClass = new Object(){}.getClass();
String className = thisClass.getEnclosingClass().getSimpleName();
String methodName = thisClass.getEnclosingMethod().getName();
Log.d("app", className + ":" + methodName);
この答えは遅れていますが、無名ハンドラークラスのコンテキストでこれを実行する別の方法があると思います。
まあ言ってみれば:
class A {
void foo() {
obj.addHandler(new Handler() {
void bar() {
String className=A.this.getClass().getName();
// ...
}
});
}
}
同じ結果が得られます。さらに、すべてのクラスはコンパイル時に定義されるため、実際には非常に便利であり、動的性が損なわれることはありません。
その上で、クラスが本当にネストされている、すなわちA
が実際にB
で囲まれている場合、Bのクラスは次のように簡単に知ることができます。
B.this.getClass().getName()
あなたの例では、this
はおそらく匿名クラスインスタンスを参照します。 Javaは、それを囲むクラスの名前に$number
を追加することによってそれらのクラスに名前を付けます。
私はこれが匿名クラスのために起こっていると思います。無名クラスを作成するときには、実際には名前を付けたクラスを拡張するクラスを作成します。
あなたが欲しい名前を得るための「よりきれいな」方法は、次のとおりです。
あなたのクラスが匿名の内部クラスであれば、getSuperClass()
はそれが作られたクラスをあなたに与えるべきです。あなたがそれをあなたがSOLのようなものではないインターフェースから作成したならば、あなたがすることができる最善はgetInterfaces()
であり、それはあなたに複数のインターフェースを与えるかもしれません。
"厄介な"方法は、単にgetClassName()
で名前を取得し、正規表現を使って$1
を削除することです。