代码之家  ›  专栏  ›  技术社区  ›  Matt Ball

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

  •  1
  • Matt Ball  · 技术社区  · 15 年前

    考虑下面的Java类:

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

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


    编辑: 抱歉,这不清楚-我想显式地使用类文字 足类 .

    4 回复  |  直到 13 年前
        1
  •  1
  •   Yishai    13 年前

    不幸的是,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是存在此方法的类。它在stacktrace中找到自己,并在前面执行一个操作,然后从stacktraceelement中提取类。

    stackTraceElement[]数组可以由new exception().getStackTrace()或thread.currentThread().getStackTrace()检索;按照编写此方法的方式,它假定stackTrace是在调用MyLogger的第一个方法时创建的。

        2
  •  2
  •   Bozho    15 年前

    使用 Class<Foo> clazz = Foo.class


    如果你需要这样的东西:

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

    并期待 Bar.foo() 归来 Bar 如果拜访 酒吧 Foo 如果拜访 -您的设计有问题,可能需要使方法非静态。

        3
  •  0
  •   ataylor    15 年前

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

        4
  •  0
  •   Marcus Adams    15 年前

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