Java – 获取当前的类名?

我所要做的就是获取当前类的名称,并将java无用的无意义$ 1添加到我的类名的末尾。 我怎样才能摆脱它,只返回实际的类名?

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

“$ 1”不是“无用的无意义的”。 如果您的class级是匿名的,则附加一个数字。

如果你不想要类本身,但是它的声明类,那么你可以使用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().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(); // ... } }); } } 

它会达到同样的结果。 另外,因为每个类都是在编译时定义的,所以实际上非常方便,所以不会损害dynamic性。

如果这个类真的是嵌套的,也就是说A实际上被B所包围,那么B的类可以很容易地被称为:

 B.this.getClass().getName() 

在你的例子中, this可能是指一个匿名类实例。 Java通过给封装类的名称附加一个$number来为这些类提供一个名称。

我假设这是发生在一个匿名类。 当你创build一个匿名类时,你实际上创build了一个类来扩展你的名字。

“干净”的方式得到你想要的名字是:

如果你的类是一个匿名的内部类, getSuperClass()应该给你创build它的类。 如果你是从一个界面创build它,那么你可以做的最好的就是getInterfaces() ,它可以给你多个界面。

“hacky”的方法是用getClassName()获取名称,然后使用正则expression式来删除$1

两种答案的结合。 还打印一个方法名称:

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

我发现这是为我的代码工作,但是我的代码是从一个for循环中的数组中获取类。

 String className=""; className = list[i].getClass().getCanonicalName(); System.out.print(className); //Use this to test it works 

reflectionAPI

有几个Reflection API可以返回类,但只有在已经直接或间接地获得Class的情况下才可以访问这些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() 

返回类的成员(包括inheritance成员)的所有公共类,接口和枚举。

  Class<?>[] c = Character.class.getClasses(); 

Character包含两个成员类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.