Java - получить имя текущего класса?

Все, что я пытаюсь сделать, это получить текущее имя класса, а java добавляет бесполезную бессмыслицу $1 в конец имени класса. Как я могу избавиться от этого и вернуть только фактическое имя класса?

String className = this.getClass().getName();
Комментарии к вопросу (3)
Решение

"$1" не является "бесполезной бессмыслицей". Если ваш класс анонимный, к нему добавляется число.

Если вам нужен не сам класс, а его декларирующий класс, то вы можете использовать getEnclosingClass(). Например:

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

Вы можете переместить это в какой-нибудь статический метод утилиты.

Но обратите внимание, что это не текущее имя класса. Анонимный класс - это другой класс, чем его объемлющий класс. Аналогично обстоит дело и с внутренними классами.

Комментарии (1)

Попробуйте

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

Это будет работать так долго, как вы Дон'т использовать его в статический метод.

Комментарии (3)

Попробуйте использовать следующее this.getClass().getCanonicalName() или this.getClass().getSimpleName(). Если это анонимный класс, используйте this.getClass().getSuperclass().getName().

Комментарии (7)

Вы можете использовать это.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();
    }
}
Комментарии (0)

Сочетание обоих ответов. Также печатает имя метода:

Class thisClass = new Object(){}.getClass();
String className = thisClass.getEnclosingClass().getSimpleName();
String methodName = thisClass.getEnclosingMethod().getName();
Log.d("app", className + ":" + methodName);
Комментарии (0)

этот ответ поздно, но я думаю, что есть другой способ сделать это в контексте анонимного класса обработчика.

позвольте'ы сказать:

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

это позволит достичь того же результата. кроме того, он'ов на самом деле очень удобно так как каждый класс определяется во время компиляции, так что нет динамичность поврежден.

кроме того, если класс действительно вложенными, т. е. А на самом деле заключена на уровне "B", класса B могут быть легко известны как:

B.this.getClass().getName()
Комментарии (0)

В вашем примере this, вероятно, относится к анонимному экземпляру класса. Java дает имя таким классам, добавляя $number к имени окружающего класса.

Комментарии (1)

Я'м предполагая, что это происходит для анонимного класса. Когда вы создаете анонимный класс, который вы на самом деле создать класс, который расширяет класс, имя которого вы получили.

В "чистых" и способ, чтобы получить имя, которое вы хотите:

Если ваш класс-это анонимный внутренний класс, getSuperClass () должны дать вам класс, что он был создан из. Если вы создали его из интерфейса, чем вы&#39;вэ-то вроде Sol, потому что лучшее, что вы можете сделать, этоgetInterfaces ()`, который может дать вам более чем один интерфейс.

В "богатство" и способ, чтобы просто получить имя С то getclassname () и использовать регулярное выражение, чтобы удалить$1`.

Комментарии (0)

Отражение Апис

есть несколько API Reflection, которые возвращают классы, но они могут только если класс уже получены либо напрямую или косвенно.

класс.getSuperclass() возвращает супер класса для данного класса.

класс c = пакета javax.качели.Jbutton с.класс.getSuperclass(); супер класс класс javax.качели.Jbutton С является javax.качели.AbstractButton.

класс.getClasses()

возврат всех общественных классов, интерфейсов и перечислений, которые являются членами класса, включая унаследованные члены.

класс<?>[] с = характер.класс.getClasses();

символ содержит два класса-члены персонажа.Подмножества и характер.UnicodeBlock.

класс.getDeclaredClasses() возвращает все классы, интерфейсы и перечисления, которые явно объявлены в этом классе.

класс<?>[] с = характер.класс.getDeclaredClasses(); символ содержит два публичных классов-членов характер.Подмножество и характер.UnicodeBlock и один частный класс характер.CharacterCache.

класс.взаимодействуйте через() Ява.яз.отразить.Поле.взаимодействуйте через() Ява.яз.отразить.Метод.взаимодействуйте через() Ява.яз.отразить.Конструктор.взаимодействуйте через() возвращает класс, в котором эти члены были объявлены. Анонимные объявления класса не будет иметь объявления Class, но у внешнего класса.

импорт Java.яз.отразить.Области;

система поле F=.класс.getfield у (на"Выход" - а); класс c = Ф.взаимодействуйте через(); В поле объявляется в системе. общественного класса MyClass { статический объект o = новый объект() { общественного недействительными м() {} }; статический класс<п> = о. getClass().getEnclosingClass(); }

класс объявления анонимный класс определяется О-это нуль.

класс.getEnclosingClass() возвращает сразу вшита класс класс.

класс c = Thread.State.class().getEnclosingClass(); включающего класса нити перечисление.Состояние резьбы.

общественного класса MyClass { статический объект o = новый объект() { общественного недействительными м() {} }; статический класс<п> = о. getClass().getEnclosingClass(); } анонимный класс определяется о. заключен классом MyClass.

Комментарии (1)

Я'вэ нашел это работать на мой код, но мой код становится класса из массива в цикле for.

String className="";

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

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

в

Комментарии (1)