如何从该类的静态方法中获取该类的名称。例如
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()
通过使用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!
*笑
一种重构安全、剪切和粘贴安全的解决方案,避免了下面定义的临时类。
写一个恢复类名的静态方法,注意在方法名中包含类名:
private static String getMyClassName(){
return MyClass.class.getName();
}
然后在你的静态方法中召回它:
public static void myMethod(){
Tracer.debug(getMyClassName(), "message");
}
重构安全性是通过避免使用字符串来实现的,剪切和粘贴安全性是被授予的,因为如果你剪切和粘贴调用者方法,你将在目标“MyClass2”类中找不到getMyClassName(),所以你将被迫重新定义和更新它。
这条指令工作得很好:
Thread.currentThread().getStackTrace()[1].getClassName();
滥用SecurityManager
System.getSecurityManager().getClassContext()[0].getName();
或者,如果没有设置,使用一个内部类来扩展它(下面的例子可耻地复制自Real的HowTo):
public static class CurrentClassGetter extends SecurityManager {
public String getClassName() {
return getClassContext()[1].getName();
}
}