我有一个类,必须有一些静态方法。在这些静态方法中,我需要调用方法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

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


当前回答

对于问题中的代码示例,标准的解决方案是通过类的名称显式引用类,甚至可以不调用getClassLoader():

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

这种方法仍然有一个缺点,如果您需要将此代码复制到许多类似的类中,它对于复制/粘贴错误不是很安全。

至于标题中的确切问题,在相邻的帖子中有一个技巧:

Class currentClass = new Object() { }.getClass().getEnclosingClass();

它使用一个嵌套的匿名Object子类来获取执行上下文。这个技巧的好处是复制/粘贴安全…

在其他类继承的基类中使用this时要注意:

同样值得注意的是,如果此代码段被塑造为某个基类的静态方法,那么currentClass值将始终是对该基类的引用,而不是可能使用该方法的任何子类的引用。

其他回答

对于问题中的代码示例,标准的解决方案是通过类的名称显式引用类,甚至可以不调用getClassLoader():

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

这种方法仍然有一个缺点,如果您需要将此代码复制到许多类似的类中,它对于复制/粘贴错误不是很安全。

至于标题中的确切问题,在相邻的帖子中有一个技巧:

Class currentClass = new Object() { }.getClass().getEnclosingClass();

它使用一个嵌套的匿名Object子类来获取执行上下文。这个技巧的好处是复制/粘贴安全…

在其他类继承的基类中使用this时要注意:

同样值得注意的是,如果此代码段被塑造为某个基类的静态方法,那么currentClass值将始终是对该基类的引用,而不是可能使用该方法的任何子类的引用。

试一试

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

Or

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

我自己也在努力解决这个问题。一个很好的技巧是在静态上下文中使用当前线程来获取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;
}

假设有一个Utility类,那么示例代码将是-

    URL url = Utility.class.getClassLoader().getResource("customLocation/".concat("abc.txt"));

CustomLocation -如果资源中有任何文件夹结构,则删除此字符串文字。

试试这样的方法。这对我很管用。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");