JAR/CLASS, implementacja interfejsu

JAR/CLASS, implementacja interfejsu
ShookTea
  • Rejestracja:ponad 12 lat
  • Ostatnio:prawie 6 lat
  • Lokalizacja:Wrocław
  • Postów:629
0

Mam mini-bibliotekę z interfejsem oraz aplikację. Aplikacja ta ma np. JFileChooser z filtrami plików .CLASS i .JAR. Moje zadanie to wykrycie w jakiś magiczny sposób, czy wybrany plik .CLASS (lub klasa główna .JAR) implementuje interfejs, a jeśli tak, to utworzyć obiekt klasy i wywołać metodę z interfejsu.

Do tej pory wykorzystywałem w taki sposób jedynie klasy znajdujące się wewnątrz mojej aplikacji, ale muszę mieć możliwość wywoływania klas z zewnątrz, wybranych przez użytkownika.

W jaki sposób to zrobić?


bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
0

Class.forName()?


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
ShookTea
Chodziło mi o plik całkowicie z zewnątrz.
bogdans
Z innej galaktyki? Class.forName() nadaje się do dowolnej klasy. A jak już pobierzesz klasę, to masz metodę getInterfaces().
ShookTea
Nie. Chodzi mi np. o to, że z klasy abc.Klasa znajdującej się w folderze "Program Files" chcę odpalić klasę def.Inna znajdującą się np. w dokumentach. Całkiem inna ścieżka.
1

Proponuje stworzyć własny classLoader na podstawie URLClassLoader za pomocą którego będziesz mógł wczytywać klasa z dowolnej lokalizacji

bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
0

Możesz uruchamiać program tak java -cp katalog1;katalog2;. TwojaKlasa, gdzie katalog1,katalog2,.. to lista wszystkich katalogów, z których chcesz odczytywać klasy.
Możesz też w metodzie main umieścić taki wiersz:

Kopiuj
System.setProperty("java.class.path",System.getProperty("java.class.path")+";katalog1;katalog2");

Jeśli używasz Linuksa, to zamień średniki na dwukropki.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
edytowany 1x, ostatnio: bogdans
ShookTea
To musi być w metodzie main, a ja potrzebuję sposobu na uruchamianie klasy w innym miejscu w kodzie. JFileChooser wybiera plik .CLASS z dowolnego miejsca na dysku, a ja sprawdzam, czy implementuje interfejs.
bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
0

java -cp C:/Programy/Java;Katalog;. TwojaKlasa, a w programie

Kopiuj
Class.forName("abc.Test")

Odpowiedź dotyczy pytania, które w międzyczasie wyparowało.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
edytowany 1x, ostatnio: bogdans
ShookTea
Słabo z synchronizacją, bo przy okazji rozwinąłem pytanie. Bzdura, nie rozwinąłem, tylko napisałem jeszcze raz to, co w pytaniu na samej górze.
ShookTea
  • Rejestracja:ponad 12 lat
  • Ostatnio:prawie 6 lat
  • Lokalizacja:Wrocław
  • Postów:629
0

Można zamknąć.

URLClassLoader do wczytania lokalizacji klasy, później loadClass().


Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.