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

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

  1. java static 变量存在哪_Java中的静态方法和静态变量存储在哪里?

    小编典典 静态方法(实际上是所有方法)以及静态变量都存储在PermGen堆的部分中,因为它们是反射数据(与类相关的数据,而不与实例相关的数据)的一部分. 更新说明: 请注意,只有变量及其技术值(原始或 ...

  2. java切面不需要接口了吗_使用java语言,如何对一个类中的静态方法做切面编程?...

    展开全部 package com.classloader.test; import java.lang.reflect.InvocationTargetException; import java.l ...

  3. java static 可见性_中级Java应该清楚的概念:原子性、可见性、有序性是什么?...

    原子性.可见性.有序性是多线程编程中最重要的几个知识点,由于多线程情况复杂,如何让每个线程能看到正确的结果,这是非常重要的,下面和千锋广州小编一起来看看吧! ​ 原子性 原子性是指一个线程的操作是不能 ...

  4. Java 静态变量,静态方法,静态常量(java static 关键字)

    Java 静态变量,静态方法,静态常量  就是变量 ,方法,常量前面添加了static 关键字 为什么要使用静态的呢 有时候在处理问题时会需要两个类在同一个内存区域共享一个数据, 不如现在 Main ...

  5. Java面试面向对象三大特征,Java面试经典基础问答三

    1. 写clone()方法时,通常都有一行代码,是什么? 在实际编程过程中,我们常常要遇到这种情况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能会需要一个和A完全相同新对象B,并且此后对 ...

  6. java核心教程_核心Java教程

    java核心教程 Welcome to Core Java Tutorial. I have written a lot on Core Java and Java EE frameworks. Th ...

  7. kotlin调用类中的方法_一种轻松的方法来测试Kotlin中令人沮丧的静态方法调用

    kotlin调用类中的方法 by Oleksii Fedorov 通过Oleksii Fedorov 一种轻松的方法来测试Kotlin中令人沮丧的静态方法调用 (A stress-free way t ...

  8. java static调用吗_Java中的static的使用

    1.Java 中被static修饰的成员称为静态成员或类成员.它属于整个类所有,而不是某个对象所有,即被类的所有对象所共享.且优先于对象存在.静态成员可以使用类名直接访问,也可以使用对象名进行访问.使 ...

  9. java static关键字的作用是什么_java中的static关键字

    一.static代表着什么 在Java中并不存在全局变量的概念,但是我们可以通过static来实现一个"伪全局"的概念,在Java中static表示"全局"或者 ...

最新文章

  1. WebStorm中SVN配置
  2. OVS bridgebundleport分析(三十四)
  3. leetcode算法题--不同的二叉搜索树
  4. 图解Windows网络命令使用实例
  5. 小学计算机国培研修总结,小学数学国培研修总结
  6. 7、MySQL选择数据库(MySQL USE语句)
  7. 10-对象实例化、内存布局与访问定位
  8. yy直播没声音html,驱动技巧:解决YY语音中麦克风无声或者有噪音的问题
  9. Java 1.8 HashMap源码探究
  10. java 生产者消费者 demo_生产者与消费者--demo1---bai
  11. IOS socket编程--Asyncsocket
  12. 电脑用户名_学会这一招,再也不用担心电脑的运行速度慢了
  13. python报表自动化系列 - 获取指定目录所有文件绝对路径
  14. 系统提示 由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作。
  15. Qt平台下使用QJson解析和构建JSON字符串
  16. 16.UNIX 环境高级编程--网络IPC:套接字
  17. spring扩展点一:BeanDefinitionRegistryPostProcessor
  18. 从零开始Labview机器视觉-图像采…
  19. SHA1WithRSA签名使用openssl 实现
  20. 找靓机用计算机表白,找靓机怎么样-2300元的鼠标用起来怎么样?Finalmouse Ultralight Phantom体验...

热门文章

  1. java基础知识(java基础知识刷题软件)
  2. Kyligence Zen 产品体验 ——AI数据指标洞察专家
  3. 计算机网络2-网络协议
  4. 站桩摘录——三年一小成,十年一飞跃
  5. PHP学习笔记(三)
  6. #bss段,data段和text段
  7. 同花顺_代码解析_五彩K线
  8. 虚拟世界无法连接服务器如何解决,Avakin Life - 3D 虚拟世界总是显示无法连接网络...
  9. OSChina 周一乱弹 —— 人生,一场漂泊
  10. Mybatis中的foreach用法