Java-получить текущее имя класса?
10 ответов
" $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 A {
void foo() {
obj.addHandler(new Handler() {
void bar() {
String className=A.this.getClass().getName();
// ...
}
});
}
}
он достигнет такого же результата. кроме того, это на самом деле довольно удобно, так как каждый класс определяется во время компиляции, поэтому динамичность не повреждена.
выше этого, если класс действительно вложен, т. е. A
на самом деле заключается в теги B
, класс B может быть легко известен как:
B.this.getClass().getName()
сочетание обоих ответов. Также печатает имя метода:
Class thisClass = new Object(){}.getClass();
String className = thisClass.getEnclosingClass().getSimpleName();
String methodName = thisClass.getEnclosingMethod().getName();
Log.d("app", className + ":" + methodName);
в вашем примере this
вероятно, относится к анонимному экземпляру класса. Java дает имя этим классам, добавляя $number
к имени заключающего класса.
Я предполагаю, что это происходит для анонимного класса. Когда вы создаете анонимный класс, вы фактически создаете класс, который расширяет класс, имя которого вы получили.
"чистильщик" способ получить имя, которое вы хотите:
если ваш класс является анонимным внутренним классом,getSuperClass()
должен дать вам класс, из которого он был создан. Если вы создали его из интерфейса, чем вы вроде SOL, потому что лучшее, что вы можете сделать, это getInterfaces()
что может дать вам больше, чем один взаимодействие.
"хакерский" способ-просто получить имя с getClassName()
и использовать регулярное выражение, чтобы удалить .
Я нашел, что это работает для моего кода, однако мой код получает класс из массива в цикле for.
String className="";
className = list[i].getClass().getCanonicalName();
System.out.print(className); //Use this to test it works
существует несколько API отражения, которые возвращают классы, но они могут доступ только в том случае, если класс уже получен либо напрямую или косвенно.
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();
символ содержит два символа классов-членов.Подмножество и
Характер.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
символ.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.