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

如何从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

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

Rama asked 2019-02-06T11:29:31Z

8个解决方案

504 votes

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

Mark Peters answered 2019-02-06T11:29:39Z

101 votes

至于问题中的代码示例,标准解决方案是通过名称显式引用类,甚至可以在没有currentClass调用的情况下执行:

class MyClass {

public static void startMusic() {

URL songPath = MyClass.class.getResource("background.midi");

}

}

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

至于标题中的确切问题,相邻线程中有一个技巧:

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

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

在其他类继承的基类中使用它时的注意事项:

值得注意的是,如果此片段被形成为某个基类的静态方法,那么currentClass值将始终是对该基类的引用,而不是对可能正在使用该方法的任何子类的引用。

Sergey Ushakov answered 2019-02-06T11:30:37Z

52 votes

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

MethodHandles.lookup().lookupClass()

Rein answered 2019-02-06T11:31:00Z

17 votes

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

}

starkadder answered 2019-02-06T11:31:23Z

13 votes

只需使用一个类文字,即NameOfClass.class

Michael Borgwardt answered 2019-02-06T11:31:45Z

9 votes

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

public final类getClass()

由于它未定义为static,因此无法在静态代码块中调用它。 有关更多信息,请参阅以下答案:Q1,Q2,Q3。

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

让Foo.class

这种类型的表达式称为类文字,它们在Java语言规范手册中进行了解释,如下所示:

类文字是一个表达式,由类,接口,数组或基本类型的名称组成,后跟一个“。” 和令牌类。 类文字的类型是Class。 它计算为由当前实例的类的定义类加载器定义的命名类型(或void)的Class对象。

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

melihcelik answered 2019-02-06T11:32:57Z

5 votes

试试吧

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

要么

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

Ishfaq answered 2019-02-06T11:33:17Z

-2 votes

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

Oliver Lagerbäck Westblom answered 2019-02-06T11:33:40Z

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值