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