所有我试图做的是让当前的类名和Java附加一个没用的无感$ 1我的类名的末尾。 我怎样才能摆脱它,只返回实际的类名?
String className = this.getClass().getName();
所有我试图做的是让当前的类名和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 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()
并使用正则表达式来删除$1
。
我发现这对我的代码工作,,但是我的代码是获得类出一个阵列内的for循环。
String className="";
className = list[i].getClass().getCanonicalName();
System.out.print(className); //Use this to test it works
反射的API
有几个思考的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();
字符包含两个成员类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.