Как да прочетете списък с класове от пакет, който е в същия jar файл като програмата

Пише се java програма, която трябва да обработва картини с помощта на оператори. Класовете на операторите се четат динамично от един пакет в програмата в масив от класове. Методът за четене работи в конзолата, но не работи в jar файла.

всъщност това е проект за обучение - правя го паралелно с подготовката за OCPJP.

Искам да го направя бързо и да науча нещо.

може ли да стане по друг начин? някакъв съвет?

идеята ми беше следната - пиша оператори за себе си, слагам ги в пакета oparators. Операторите наследяват от абстрактния клас AbstractOperator. Програмата автоматично чете пакета на операторите и зарежда класовете от там в масива. Направете dropbox от масива, дистанцирайте операторите и ги приложете, полиморфизъм всичко е красиво и т.н.

След това искам да го пакетирам в изпълним масив и да го изпратя на някого. така че човек без да се суете, стартира jar и гледа, а не разопакова архива, търсейки пакетен файл.

Няма такъв начин. Освен ако не са някои без документи.

Вместо това препоръчвам да използвате обработка на анотация, по време на компилация за вашия проект, направете списък с класове и го поставете в отделен файл. Местоположението по подразбиране за такива файлове е в META-INF/services/. Можете да заредите екземпляри на класове от този списък с помощта на класа ServiceLoader.

Е, или ръчно направете този списък.

Колкото е възможно повече. обработката на анотация е нещо добро, а не малко отговор на въпроса. Да приемем, че има причини да не го използвате. Тогава обикновено източникът на код, т.е. jar архив с класове, взет като файл, от него като от zip архив се чете списък с файлове и ако името на файласъответства на определен модел (например е в определен пакет), класът със същото име се зарежда. Можете да получите източник на код нещо подобно:

Въпреки това, това ще получи само местоположението на текущия клас. Всички свързани URL адреси могат да бъдат получени по следния начин:

Този метод се счита за не много добър, тъй като класовете могат да се зареждат не само от jar архиви. Като минимум трябва да обмислите зареждане от директория, но на теория класовете могат да се зареждат отвсякъде и източникът на код може да отсъства, т.е. getCodeSource() ще върне нула. Въпреки това, много хора използват този метод. Например, log4j зарежда плъгини по този начин, но обработката на анотации също присъства там, никой не е отменил комбинацията от подходи.