Quanto ao exemplo de código na pergunta, a solução padrão é referenciar a classe explicitamente pelo nome, e é até possível sem a getClassLoader()
chamada:
class MyClass {
public static void startMusic() {
URL songPath = MyClass.class.getResource("background.midi");
}
}
Essa abordagem ainda tem um verso: não é muito seguro contra erros de copiar / colar, caso você precise replicar esse código para várias classes semelhantes.
E quanto à pergunta exata no título, há um truque publicado no segmento adjacente :
Class currentClass = new Object() { }.getClass().getEnclosingClass();
Ele usa uma Object
subclasse anônima aninhada para se apossar do contexto de execução. Esse truque tem a vantagem de ser seguro copiar / colar ...
Cuidado ao usar isso em uma Classe Base que outras classes herdam de:
Também é importante notar que, se esse snippet for modelado como um método estático de alguma classe base, o currentClass
valor sempre será uma referência a essa classe base e não a qualquer subclasse que possa estar usando esse método.
getResource()
antes de haver uma instância de uma classe definida pelo usuário (por exemplo, não J2SE) às vezes falha. O problema é que o JRE estará usando o carregador de classes de autoinicialização nesse estágio, que não terá recursos de aplicativos no caminho da classe (do carregador de autoinicialização).