Java - получить имя текущего класса? - PullRequest
247 голосов
/ 08 июня 2011

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

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

Ответы [ 10 ]

230 голосов
/ 08 июня 2011

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

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

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

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

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

195 голосов
/ 13 июня 2012

Try,

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

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

27 голосов
/ 08 июня 2011

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

10 голосов
/ 26 сентября 2015

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

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

Class thisClass = new Object(){}.getClass();
String className = thisClass.getEnclosingClass().getSimpleName();
String methodName = thisClass.getEnclosingMethod().getName();
Log.d("app", className + ":" + methodName);
3 голосов
/ 24 февраля 2015

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

скажем:

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

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

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

B.this.getClass().getName()
2 голосов
/ 08 июня 2011

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

1 голос
/ 08 июня 2011

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

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

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

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

0 голосов
/ 08 сентября 2016

API отражения

Есть несколько 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.
0 голосов
/ 01 мая 2014

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

String className="";

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

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