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

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

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

Ответ 1

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

Если вам не нужен сам класс, но его класс объявления, вы можете использовать getEnclosingClass(). Например:

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

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

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

Ответ 2

Попробуйте,

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

скажем:

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

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

выше, что если класс действительно вложен, т.е. A на самом деле заключен в B, класс B можно легко назвать:

B.this.getClass().getName()

Ответ 6

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

Ответ 7

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

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

Ответ 8

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

"Чистый" способ получить нужное имя:

Если ваш класс является анонимным внутренним классом, getSuperClass() должен предоставить вам класс, из которого он был создан. Если вы создали его из интерфейса, чем ваш SOL, потому что лучшее, что вы можете сделать, это getInterfaces(), которое может дать вам несколько интерфейсов.

"Хакерный" способ - просто получить имя с помощью getClassName() и использовать регулярное выражение для удаления $1.

Ответ 9

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

String className="";

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

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

Ответ 10

API-интерфейсы Reflection

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

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.Subset и
Character.UnicodeBlock.

        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.