Java -获取当前类名?

我所要做的就是获取当前的类名,而java在我的类名后面附加了一个无用的、无意义的1美元。我怎么能摆脱它,只返回实际的类名?

String className = this.getClass().getName();
720283 次浏览

“1美元”不是“无用的废话”。如果您的类是匿名的,则会追加一个数字。

如果你不想要类本身,但它声明类,那么你可以使用getEnclosingClass()。例如:

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

你可以把它移动到一些静态工具方法中。

但请注意,这不是当前的类名。匿名类与它的外围类不同。内部类的情况也类似。

在你的例子中,this可能引用一个匿名类实例。Java通过将$number附加到外围类的名称来为这些类命名。

试试这个 this.getClass().getCanonicalName()this.getClass().getSimpleName()。如果是匿名类,则使用this.getClass().getSuperclass().getName()

我假设这发生在一个匿名类中。当你创建一个匿名类时,你实际上创建了一个类,它扩展了你所获得的类名。

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

如果你的类是一个匿名的内部类,getSuperClass()应该给你创建它的类。如果你从一个接口创建它,那么你就有点SOL了,因为你能做的最好的是getInterfaces(),它可能会给你多个接口。

“hack”的方法是使用getClassName()获取名称,并使用正则表达式删除$1

试,

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

只要你不在静态方法中使用它,它就可以工作。

我发现这适用于我的代码,但是我的代码是在for循环中从数组中获取类。

String className="";


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


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

这个回答有点晚了,但我认为在匿名处理程序类的上下文中还有另一种方法可以做到这一点。

比方说:

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

它会达到同样的结果。此外,它实际上非常方便,因为每个类都是在编译时定义的,因此不会破坏动态性。

在此之上,如果类确实是嵌套的,即A实际上是由B包围的,则B的类可以很容易地称为:

B.this.getClass().getName()

你可以像这样使用this.getClass().getSimpleName():

import java.lang.reflect.Field;


public class Test {


int x;
int y;


public String getClassName() {


String className = this.getClass().getSimpleName();
System.out.println("Name:" + className);
return className;
}


public Field[] getAttributes() {


Field[] attributes = this.getClass().getDeclaredFields();
for(int i = 0; i < attributes.length; i++) {
System.out.println("Declared Fields" + attributes[i]);
}


return attributes;
}


public static void main(String args[]) {


Test t = new Test();
t.getClassName();
t.getAttributes();
}
}

反射api

有几个反射api返回类,但这些可能 只有当一个类已经被直接获取时才被访问 或间接. < / p >
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包含两个成员类Character。子集和< br > Character.UnicodeBlock . < / p >

        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.

两个答案的组合。还输出一个方法名:

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

这是一个Android版本,但同样的原则也可以用在纯Java中。

private static final String TAG = YourClass.class.getSimpleName();
private static final String TAG = YourClass.class.getName();

在我的例子中,我使用这个Java类:

private String getCurrentProcessName() {
String processName = "";
int pid = android.os.Process.myPid();
    

ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
for (ActivityManager.RunningAppProcessInfo processInfo : manager.getRunningAppProcesses()) {
if (processInfo.pid == pid) {
processName = processInfo.processName;
break;
}
}
    

return processName;
}