我有一个类,必须有一些静态方法。在这些静态方法中,我需要调用方法getClass()来进行以下调用:

public static void startMusic() {
  URL songPath = getClass().getClassLoader().getResource("background.midi");
}

但是Eclipse告诉我:

Cannot make a static reference to the non-static method getClass() 
from the type Object

修复此编译时错误的适当方法是什么?


当前回答

我自己也在努力解决这个问题。一个很好的技巧是在静态上下文中使用当前线程来获取ClassLoader。这也可以在Hadoop MapReduce中工作。其他方法在本地运行时有效,但在MapReduce中使用时返回空InputStream。

public static InputStream getResource(String resource) throws Exception {
   ClassLoader cl = Thread.currentThread().getContextClassLoader();
   InputStream is = cl.getResourceAsStream(resource);
   return is;
}

其他回答

getClass()方法在Object类中定义,具有以下签名:

getClass()

因为它没有被定义为静态的,所以不能在静态代码块中调用它。更多信息请看这些答案:Q1, Q2, Q3。

如果你在一个静态的上下文中,那么你必须使用类文字表达式来获取类,所以你基本上必须这样做:

Foo.class

这种类型的表达式被称为类字面量,它们在Java语言规范书中解释如下:

类字面值是由类、接口、数组或基本类型的名称后跟'组成的表达式。'和令牌类。类文字的类型是class。它为当前实例的类的定义类装入器所定义的命名类型(或void)求值为Class对象。

您还可以在类的API文档中找到有关此主题的信息。

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

MethodHandles.lookup().lookupClass()

试试这样的方法。这对我很管用。Logg(班级名称)

    String level= "";

    Properties prop = new Properties();

    InputStream in =
            Logg.class.getResourceAsStream("resources\\config");

    if (in != null) {
        prop.load(in);
    } else {
        throw new FileNotFoundException("property file '" + in + "' not found in the classpath");
    }

    level = prop.getProperty("Level");

试一试

Thread.currentThread().getStackTrace()[1].getClassName()

Or

Thread.currentThread().getStackTrace()[2].getClassName()

简单地使用类文字,即NameOfClass.class