Что касается примера кода в вопросе, стандартное решение состоит в том, чтобы явно ссылаться на класс по его имени, и даже можно обойтись без getClassLoader()
вызова:
class MyClass {
public static void startMusic() {
URL songPath = MyClass.class.getResource("background.midi");
}
}
У этого подхода есть обратная сторона: он не очень безопасен от ошибок копирования / вставки в случае, если вам нужно скопировать этот код на ряд похожих классов.
А что касается точного вопроса в заголовке, в соседней теме есть трюк :
Class currentClass = new Object() { }.getClass().getEnclosingClass();
Он использует вложенный анонимный Object
подкласс для получения контекста выполнения. Преимущество этого трюка в том, что он защищен от копирования / вставки ...
Будьте осторожны при использовании этого в Базовом классе, который наследуют другие классы:
Также стоит отметить, что если этот фрагмент сформирован как статический метод некоторого базового класса, тогда currentClass
value всегда будет ссылкой на этот базовый класс, а не на любой подкласс, который может использовать этот метод.
getResource()
до того, как будет создан экземпляр пользовательского (например, не J2SE) класса, иногда будет неудачным. Проблема в том, что JRE будет использовать загрузчик классов начальной загрузки на этом этапе, у которого не будет ресурсов приложения на пути к классам (загрузчика начальной загрузки).