如何从该类的静态方法中获取该类的名称。例如

public class MyClass {
    public static String getClassName() {
        String name = ????; // what goes here so the string "MyClass" is returned
        return name;
    }
}

为了把它放在上下文中,我实际上想在异常中返回类名作为消息的一部分。


当前回答

我使用它在类的顶部初始化Log4j Logger(或注释)。

优点:Throwable已经加载,你可能会节省资源,不使用“IO重型”安全管理器。

反:有些问题是,这是否适用于所有jvm。

// Log4j . Logger --- Get class name in static context by creating an anonymous Throwable and 
// getting the top of its stack-trace. 
// NOTE you must use: getClassName() because getClass() just returns StackTraceElement.class 
static final Logger logger = Logger.getLogger(new Throwable() .getStackTrace()[0].getClassName()); 

其他回答

为了正确地支持重构(重命名类),那么你应该使用:

 MyClass.class.getName(); // full name with package

或者(感谢@James Van Huis):

 MyClass.class.getSimpleName(); // class name and no more

按照@toolkit说的去做。不要做这样的事情:

return new Object() { }.getClass().getEnclosingClass();

(编辑:或者如果你使用的Java版本是在这个答案最初写出来之后才出现的,使用@Rein的答案。)

滥用SecurityManager

System.getSecurityManager().getClassContext()[0].getName();

或者,如果没有设置,使用一个内部类来扩展它(下面的例子可耻地复制自Real的HowTo):

public static class CurrentClassGetter extends SecurityManager {
    public String getClassName() {
        return getClassContext()[1].getName(); 
    }
}

我需要在多个类的静态方法中的类名,所以我用下面的方法实现了一个JavaUtil类:

public static String getClassName() {
    String className = Thread.currentThread().getStackTrace()[2].getClassName();
    int lastIndex = className.lastIndexOf('.');
    return className.substring(lastIndex + 1);
}

希望对大家有所帮助!

通过使用JNI,您可以像这样做一些非常甜蜜的事情:

MyObject.java:

public class MyObject
{
    static
    {
        System.loadLibrary( "classname" );
    }

    public static native String getClassName();

    public static void main( String[] args )
    {
        System.out.println( getClassName() );
    }
}

然后:

javac MyObject.java
javah -jni MyObject

然后:

MyObject.c:

#include "MyObject.h"

JNIEXPORT jstring JNICALL Java_MyObject_getClassName( JNIEnv *env, jclass cls )
{
    jclass javaLangClass = (*env)->FindClass( env, "java/lang/Class" );
    jmethodID getName = (*env)->GetMethodID( env, javaLangClass, "getName",
        "()Ljava/lang/String;" );
    return (*env)->CallObjectMethod( env, cls, getName );
}

然后将C编译到一个名为libclassname的共享库中。然后运行java!

*笑