En cuanto al ejemplo de código en la pregunta, la solución estándar es hacer referencia a la clase explícitamente por su nombre, e incluso es posible hacerlo sin getClassLoader()
llamar:
class MyClass {
public static void startMusic() {
URL songPath = MyClass.class.getResource("background.midi");
}
}
Este enfoque todavía tiene una parte posterior de que no es muy seguro contra los errores de copiar / pegar en caso de que necesite replicar este código en varias clases similares.
Y en cuanto a la pregunta exacta en el título, hay un truco publicado en el hilo adyacente :
Class currentClass = new Object() { }.getClass().getEnclosingClass();
Utiliza una Object
subclase anónima anidada para obtener el contexto de ejecución. Este truco tiene la ventaja de ser seguro para copiar / pegar ...
Tenga cuidado al usar esto en una clase base que otras clases heredan de:
También vale la pena señalar que si este fragmento se forma como un método estático de alguna clase base, el currentClass
valor siempre será una referencia a esa clase base en lugar de a cualquier subclase que pueda estar usando ese método.
getResource()
antes de que haya una instancia de una clase definida por el usuario (por ejemplo, no J2SE) a veces fallará. El problema es que el JRE usará el cargador de clases bootstrap en esa etapa, que no tendrá recursos de aplicación en la ruta de clase (del cargador bootstrap).