我有一个类,必须有一些静态方法。在这些静态方法中,我需要调用方法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
修复此编译时错误的适当方法是什么?
getClass()方法在Object类中定义,具有以下签名:
getClass()
因为它没有被定义为静态的,所以不能在静态代码块中调用它。更多信息请看这些答案:Q1, Q2, Q3。
如果你在一个静态的上下文中,那么你必须使用类文字表达式来获取类,所以你基本上必须这样做:
Foo.class
这种类型的表达式被称为类字面量,它们在Java语言规范书中解释如下:
类字面值是由类、接口、数组或基本类型的名称后跟'组成的表达式。'和令牌类。类文字的类型是class。它为当前实例的类的定义类装入器所定义的命名类型(或void)求值为Class对象。
您还可以在类的API文档中找到有关此主题的信息。
这个问题的答案
只需使用classname .class而不是getClass()。
宣布伐木工
Since this gets so much attention for a specific usecase--to provide an easy way to insert log declarations--I thought I'd add my thoughts on that. Log frameworks often expect the log to be constrained to a certain context, say a fully-qualified class name. So they are not copy-pastable without modification. Suggestions for paste-safe log declarations are provided in other answers, but they have downsides such as inflating bytecode or adding runtime introspection. I don't recommend these. Copy-paste is an editor concern, so an editor solution is most appropriate.
在IntelliJ中,我建议添加一个Live模板:
使用“log”作为缩写
使用私有静态final org.slf4j。Logger Logger = org.slf4j.LoggerFactory.getLogger($CLASS$.class);作为模板文本。
单击“编辑变量”并使用表达式className()添加CLASS
选中复选框以重新格式化和缩短FQ名称。
将上下文更改为Java: declaration。
现在如果你输入log<tab>它会自动展开到
private static final Logger logger = LoggerFactory.getLogger(ClassName.class);
并自动为您重新格式化和优化导入。
getClass()方法在Object类中定义,具有以下签名:
getClass()
因为它没有被定义为静态的,所以不能在静态代码块中调用它。更多信息请看这些答案:Q1, Q2, Q3。
如果你在一个静态的上下文中,那么你必须使用类文字表达式来获取类,所以你基本上必须这样做:
Foo.class
这种类型的表达式被称为类字面量,它们在Java语言规范书中解释如下:
类字面值是由类、接口、数组或基本类型的名称后跟'组成的表达式。'和令牌类。类文字的类型是class。它为当前实例的类的定义类装入器所定义的命名类型(或void)求值为Class对象。
您还可以在类的API文档中找到有关此主题的信息。
对于问题中的代码示例,标准的解决方案是通过类的名称显式引用类,甚至可以不调用getClassLoader():
class MyClass {
public static void startMusic() {
URL songPath = MyClass.class.getResource("background.midi");
}
}
这种方法仍然有一个缺点,如果您需要将此代码复制到许多类似的类中,它对于复制/粘贴错误不是很安全。
至于标题中的确切问题,在相邻的帖子中有一个技巧:
Class currentClass = new Object() { }.getClass().getEnclosingClass();
它使用一个嵌套的匿名Object子类来获取执行上下文。这个技巧的好处是复制/粘贴安全…
在其他类继承的基类中使用this时要注意:
同样值得注意的是,如果此代码段被塑造为某个基类的静态方法,那么currentClass值将始终是对该基类的引用,而不是可能使用该方法的任何子类的引用。