如何从该类的静态方法中获取该类的名称。例如
public class MyClass {
public static String getClassName() {
String name = ????; // what goes here so the string "MyClass" is returned
return name;
}
}
为了把它放在上下文中,我实际上想在异常中返回类名作为消息的一部分。
如何从该类的静态方法中获取该类的名称。例如
public class MyClass {
public static String getClassName() {
String name = ????; // what goes here so the string "MyClass" is returned
return name;
}
}
为了把它放在上下文中,我实际上想在异常中返回类名作为消息的一部分。
当前回答
为了正确地支持重构(重命名类),那么你应该使用:
MyClass.class.getName(); // full name with package
或者(感谢@James Van Huis):
MyClass.class.getSimpleName(); // class name and no more
其他回答
在Java 7+中,你可以在静态方法/字段中做到这一点:
MethodHandles.lookup().lookupClass()
按照@toolkit说的去做。不要做这样的事情:
return new Object() { }.getClass().getEnclosingClass();
(编辑:或者如果你使用的Java版本是在这个答案最初写出来之后才出现的,使用@Rein的答案。)
如果你正在使用反射,你可以获取Method对象,然后:
method.getDeclaringClass().getName()
要获取方法本身,您可以使用:
Class<?> c = Class.forName("class name");
Method method = c.getDeclaredMethod ("method name", parameterTypes)
滥用SecurityManager
System.getSecurityManager().getClassContext()[0].getName();
或者,如果没有设置,使用一个内部类来扩展它(下面的例子可耻地复制自Real的HowTo):
public static class CurrentClassGetter extends SecurityManager {
public String getClassName() {
return getClassContext()[1].getName();
}
}
我在静态和非静态场景中都使用了这两种方法:
主要课程:
//For non static approach
public AndroidLogger(Object classObject) {
mClassName = classObject.getClass().getSimpleName();
}
//For static approach
public AndroidLogger(String className) {
mClassName = className;
}
如何提供类名:
非静态方式:
private AndroidLogger mLogger = new AndroidLogger(this);
静态方法:
private static AndroidLogger mLogger = new AndroidLogger(Myclass.class.getSimpleName());