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

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

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


当前回答

在Java 7+中,你可以在静态方法/字段中做到这一点:

MethodHandles.lookup().lookupClass()

其他回答

如果你正在使用反射,你可以获取Method对象,然后:

method.getDeclaringClass().getName()

要获取方法本身,您可以使用:

Class<?> c = Class.forName("class name");
Method  method = c.getDeclaredMethod ("method name", parameterTypes)

我在静态和非静态场景中都使用了这两种方法:

主要课程:

//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());

在Java 7+中,你可以在静态方法/字段中做到这一点:

MethodHandles.lookup().lookupClass()

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

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

或者(感谢@James Van Huis):

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

因为问题是' this.class '而不是' ClassName.class ' ?被标记为这个的重复(这是有争议的,因为这个问题是关于类而不是类名),我在这里发布答案:

class MyService {
    private static Class thisClass = MyService.class;
    // or:
    //private static Class thisClass = new Object() { }.getClass().getEnclosingClass();
    ...
    static void startService(Context context) {
        Intent i = new Intent(context, thisClass);
        context.startService(i);
    }
}

将thisClass定义为private很重要,因为: 1)它不能被继承:派生类必须要么定义自己的thisClass,要么产生错误消息 2)其他类的引用应该使用ClassName.class而不是ClassName.thisClass。

定义了thisClass后,对类名的访问变为:

thisClass.getName()