我想做的就是获取当前类名,但Java会在我的类名末尾添加一个无用的非常规$1。如何摆脱它并仅返回实际的类名?
String className = this.getClass().getName();
尝试一下,
String className = this.getClass().getSimpleName();
这将只在非静态方法中起作用。""
。 - vikingsteve“$1”不是“无用的废话”。如果你的类是匿名的,那么会附加一个数字。
如果你不想要类本身,而是其声明类,则可以使用getEnclosingClass()
。例如:
Class<?> enclosingClass = getClass().getEnclosingClass();
if (enclosingClass != null) {
System.out.println(enclosingClass.getName());
} else {
System.out.println(getClass().getName());
}
你可以将它放在一些静态实用方法中。
但请注意,这不是当前类名。匿名类是与其封闭类不同的类。内部类的情况类似。
尝试使用以下代码: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 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();
}
}
Class thisClass = new Object(){}.getClass();
String className = thisClass.getEnclosingClass().getSimpleName();
String methodName = thisClass.getEnclosingMethod().getName();
Log.d("app", className + ":" + methodName);
class A {
void foo() {
obj.addHandler(new Handler() {
void bar() {
String className=A.this.getClass().getName();
// ...
}
});
}
}
它将实现相同的结果。此外,由于每个类都是在编译时定义的,因此实际上非常方便,因此没有破坏动态性。
如果类真的是嵌套的,即A
实际上被B
所包含,则可以轻松知道B的类:
B.this.getClass().getName()
private static final String TAG = YourClass.class.getSimpleName();
private static final String TAG = YourClass.class.getName();
this
可能是指一个匿名类实例。Java 会通过在封闭类名称后附加 $number
来为这些类命名。我猜这是发生在匿名类中。当你创建一个匿名类时,实际上你创建了一个继承了你所得到的类的类。
获取你想要的名称的“干净”方法是:
如果你的类是一个匿名内部类,getSuperClass()
应该会给你它所创建的类。如果你从一个接口创建它,那么你就有点麻烦了,因为你最好能做的只是使用 getInterfaces()
,但这可能会给你多个接口。
“hacky”的方法是使用 getClassName()
获取名称,并使用正则表达式删除 $1
。
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;
}
String className = getClass().getName().substring(0, getClass().getName().indexOf("$"))
。 - josh.trow$1
,那是因为这个类的名字是$1
。如果你期望得到其他内容,请在正确的类中使用this
而不是错误的类。 - ceving