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

Java 是否可以在静态方法中访问类对象?,java,Java,考虑以下Java类: public class Foo { public static void doStuff() { // boring stuff here } } 是否可以从静态方法(如doStuff())中访问类literalFoo.class,或仅访问类名“Foo”?在非静态方法中,我只调用this.getClass(),但在静态方法中没有this 编辑:很抱歉,这不清楚-我想显式使用class literalFoo.class使用clas

考虑以下Java类:

public class Foo
{
    public static void doStuff()
    {
        // boring stuff here
    }
}
是否可以从静态方法(如
doStuff()
)中访问类literal
Foo.class
,或仅访问类名
“Foo”
?在非静态方法中,我只调用
this.getClass()
,但在静态方法中没有
this


编辑:很抱歉,这不清楚-我想显式使用class literal
Foo.class
使用
class clazz=Foo.class


如果您需要以下内容:

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

class Bar extends Foo {

}

如果在
Bar
上调用
Bar
,则期望
Bar.foo()
返回
Bar
,如果在
foo
上调用
foo
,则期望
foo()返回
Bar
——您的设计中存在一些错误,可能需要使方法非静态。

只需使用
foo.class
。您不必担心继承之类的问题,因为没有与静态方法关联的对象。

处理静态方法时,您可以将它们视为库,其中类名成为库名。通过指定库(类)名称,可以告诉编译器要运行哪个bar()方法
Foo.bar()
vs.
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
构造来引用当前的类。

不幸的是,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;
}
私有静态StackTraceeElement GetCallersTackTraceeElement(StackTraceeElement[]元素){
for(int i=0;i
在本例中,MyLogger是存在此方法的类。它在stacktrace中找到自己,并在前面运行一次,然后从StackTraceElement中提取类


StackTraceElement[]数组可以由new Exception().getStackTrace()或Thread.currentThread().getStackTrace()检索;该方法的编写方式假定stacktrace是在对MyLogger的第一次方法调用时创建的。

我的问题的全部要点是在不引用
Foo.class
的情况下执行此操作。要真正回答您的问题,可以在静态方法中使用
Foo.class
,但不能使用
this.getClass()
。这是一个问题的唯一原因是Java奇怪的静态方法继承(说真的,静态方法不应该落入子类……c#明确禁止这样做)。静态方法在Java中不是虚拟的。这是使用工厂模式的原因之一。你能详细说明一下你到底做了什么吗?也许可以添加一点代码?