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