如何在Java中从静态方法调用getClass()?答案

2022-08-31 04:37:56

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

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


答案 1

答案

只需使用而不是 .TheClassName.classgetClass()

声明记录器

由于这引起了对特定用例的极大关注 - 提供一种插入日志声明的简单方法 - 我想我会对此添加我的想法。日志框架通常期望将日志约束到某个上下文,例如完全限定的类名。因此,未经修改,它们不可复制粘贴。粘贴安全日志声明的建议在其他答案中提供,但它们有缺点,例如膨胀字节码或添加运行时自省。我不建议这些。复制粘贴是编辑器关注的问题,因此编辑器解决方案是最合适的。

在IntelliJ中,我建议添加一个实时模板:

  • 使用“log”作为缩写
  • 用作模板文本。private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger($CLASS$.class);
  • 单击编辑变量并使用表达式添加类className()
  • 选中复选框以重新格式化和缩短 FQ 名称。
  • 将上下文更改为 Java: 声明。

现在,如果您键入,它将自动扩展到log<tab>

private static final Logger logger = LoggerFactory.getLogger(ClassName.class);

并自动为您重新格式化和优化导入。


答案 2

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

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

这种方法仍然有一个背面,以防万一您需要将此代码复制到许多类似的类,它对复制/粘贴错误不是很安全。

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

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

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

在其他类继承自的基类中使用它时要小心:

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


推荐