是否可以在静态方法中访问Class对象?

时间:2010-04-15 18:47:21

标签: java

考虑以下Java类:

public class Foo
{
    public static void doStuff()
    {
        // boring stuff here
    }
}

是否可以从静态方法(例如Foo.class)访问类文字"Foo"或类名doStuff()?在非静态方法中,我只需调用this.getClass(),但在静态方法中没有this


编辑:抱歉这不清楚 - 我想明确使用类文字Foo.class来执行此操作。

4 个答案:

答案 0 :(得分:2)

使用Class<Foo> clazz = Foo.class


如果您需要以下内容:

class Foo {
    static Class foo(){return the current class}
}

class Bar extends Foo {

}

并期望Bar.foo()Bar上被调用时返回Bar,如果在Foo上调用Foo - 您的设计可能有问题你需要使方法非静态。

答案 1 :(得分:1)

不幸的是,Java并没有给你一个很好的方法来做到这一点。您只需要参考Foo.class。这对我来说是一种常见的烦恼。

对于日志记录,我通过读取堆栈解决了它(解决方案的想法来自Log5j),因为每次为每个记录器重新创建类都非常烦人。幸运的是,现代IDE使其变得相对轻松,因此如果您必须更改类的名称,重构不会受到负面影响。

编辑:一些代码:

private static StackTraceElement getCallerStackTraceElement(StackTraceElement[] elements) {
    for (int i = 0; i < elements.length; i++) {
        if (elements[i].getClassName().equals(MyLogger.class.getName())) {
            return elements[i + 1];
        }
    }
    return null;
}

在这种情况下,MyLogger是此方法所在的类。它在堆栈跟踪中找到它并且更早出现,然后从StackTraceElement中提取类。

可以通过新的Exception()。getStackTrace()或Thread.currentThread()来获取StackTraceElement []数组.getStackTrace();编写此方法的方式是假设在第一次调用MyLogger方法时创建了堆栈跟踪。

答案 2 :(得分:0)

只需使用Foo.class即可。您不必担心继承或类似的事情,因为没有与静态方法相关联的对象。

答案 3 :(得分:0)

处理静态方法时,可以将它们视为库,其中类名称成为库名。通过指定库(类)名称告诉编译器运行哪个bar()方法。 Foo.bar()Bar.bar()

该方法本身没有父级,也没有实例,因此,它不能使用反射来知道它所属的类。但是,您可以添加反射方法。

您可以向类中添加一个静态方法,以便自己回答它所在的类:

public class Foo {

    private static class self() {
        return Foo.class;
    }

    public static void doStuff()
    {
        // Use self() to reference the Foo class
    }
}

请注意,我将self()方法设为私有,因为在类之外,它没有任何意义。

这是有效的,因为self()方法在类内部和静态方法中是可见的。

相比之下,PHP有self构造来引用当前类。