如何从Java中的静态方法调用getClass()?

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

什么是解决这个编译时错误的适当方法?

只需使用TheClassName.class而不是getClass()

就问题中的代码示例而言,标准解决scheme是通过名称显式引用类,甚至可以不使用getClassLoader()调用:

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

这种方法仍然有一个背面,它不是非常安全的复制/粘贴错误的情况下,您需要将此代码复制到一些类似的类。

至于标题中的确切问题,在相邻的主题中有一个窍门:

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

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

也许值得注意的是,如果这个片段被定型为某个基类的静态方法,那么currentClass值将总是对该基类的引用,而不是任何可能使用该方法的子类。

在Java7 +中,您可以在静态方法/字段中执行此操作:

 MethodHandles.lookup().lookupClass() 

我自己摔跤。 一个很好的窍门就是在静态上下文中使用当前线程来获取ClassLoader。 这也可以在Hadoop MapReduce中使用。 其他方法在本地运行时工作,但在MapReduce中使用时返回null InputStream。

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

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

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

public final Class getClass()

由于它没有被定义为static ,你不能在静态代码块中调用它。 有关更多信息,请参阅以下答案: Q1 , Q2 , Q3 。

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

让Foo.class

这种types的expression式称为类文字(Literals) ,它们在Java语言规范手册 ( Java Language Specification Book)中解释如下:

类文字是一个expression式,由一个类,接口,数组或基本types的名称组成,后跟一个`。'。 和令牌类。 类文字的types是Class。 它根据当前实例的类的定义类加载器的定义,对指定types(或void)的Class对象进行求值。

您也可以在Class的API文档中find关于此主题的信息。

尝试一下

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

要么

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

尝试这样的事情。 这个对我有用。 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");