Як рахувати список класів з пакета який знаходиться в тому ж jar-файлі що і програма

Пишається програма на java, яка має обробляти картинки за допомогою операторів. Класи операторів зчитуються динамічно з одного пакета в програмі до масиву класів. Метод для зчитування працює в консолі, а в jar-файлі не працює.

загалом це навчальний проект - роблю паралельно з підготовкою до OCPJP.

хочу зробити швидко і навчитися чогось.

може можна якось інакше реалізувати? порадить щось?

моя ідея була така - пишу собі оператори, складаю в пакет операторів. Оператори успадковують у абстрактного класу AbstractOperator. Програма автоматично читає пакет operators і вантажить класи звідти до масиву. З масиву робите dropbox, істанціює оператори і змінює їх, поліморфізм, все красиво і т.д.

Потім хочеться запакувати у виконуваний масив і надіслати комусь. Щоб чоловік без суєти, запустив jar і подивився, а не розпаковував архів, шукав батник.

Нема такого способу. Хіба що якийсь недокументований.

Натомість рекомендую з використанням annotation processing, під час компіляції вашого проекту скласти список класів та помістити його в окремий файл. Стандартне розташування таких файлів - META-INF/services/ . Завантажити екземпляри класів із цього списку можна за допомогою ServiceLoader.

Ну чи вручну цей перелік складати.

Ще як можна. annotation processing - хороша річ, не трохи не відповідь на запитання. Припустимо, є причини його не використовувати. Тоді зазвичай джерело коду (code source), тобто. jar архів з класами, береться як файл, з нього, як із zip архіву, читається список файлів, і, якщо назва файлувідповідає певному шаблону (наприклад, знаходиться у певному пакеті), завантажується клас тією самою назвою. Отримати code source можна якось так:

Хоча цим буде отримано лише розташування поточного класу. Всі лінковані URL можна отримати так:

Цей спосіб вважається не дуже добрим, тому що класи можуть завантажуватися не тільки з jar архівів. Як мінімум, потрібно врахувати завантаження з директорії, але теоретично класи можуть завантажуватися звідки завгодно, а code source цілком може бути, тобто. getCodeSource() поверне null. Тим не менш, багато хто користується цим способом. Наприклад, log4j завантажує плагіни таким чином, але annotation processing там теж присутній, комбінування підходів таки ніхто не скасовував.