Wypakowanie klasy z pliku

0

Potrzebuję sposobu na zrobienie systemu wtyczek. Klasa Main odpowiedzialna za ładowanie pluginów z pliku *.class jest spakowana do *.exe. Katalog plugins zawierający plik Wtyczka.class jest w tym samym katalogu, co exe. Załóżmy, że ścieżkę dostępu do katalogu z plikiem exe i folderem plugins mamy w zmiennej path. Jak za pomocą ClassLoadera lub czegoś innego utworzyć obiekt Class reprezentujący klasę Wtyczka?

0
package test;

/**
 * Hello world!
 *
 */
public class App 
{
    public static void main( String[] args )
    {
        try {
        	Wtyczka w;
			Class class1 = Class.forName("test.WtyczkaImpl");
			w = (Wtyczka)(class1.newInstance());
			System.out.println(w);
			
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
        
    }
}

class WtyczkaImpl implements Wtyczka{}

interface Wtyczka{}
0

Z tego co widzę, w Twoim kodzie wtyczka jest w tym samym pakiecie co klasa App. To nie wchodzi w grę, ponieważ klasa App musi być spakowana do *.exe, a wtyczki nie są w exeku tylko w katalogu plugins zamieszczonym obok pliku wykonywalnego. Krótko mówiąc, mam wczytać klasę z pliku położonego niezależnie od klasy wczytującej.

0

Nie w tym rzecz. Najważniejsze jest:

Class class1 = Class.forName("test.WtyczkaImpl");

Oraz to że używasz interfejsów, a nie klas.

0

W momencie wyeksportowania klasy App do JAR przestało działać. Wtyczki przecież nie mogłem razem z programem spakować.

W pierwszem poście podałem nazwy niektórych zmiennych, folderów i plików. Proszę o korzystanie tych nazw, ponieważ łatwiej i szybciej połapię się w kodzie.

0

A czy klasa z wtyczką jest w classpathe?

0

Nie jest, ponieważ program jest spakowany do exe a wtyczki muszą być poza plikiem wykonywalnym. Jeśli mimo to można włączyć folder wtyczek do classpath to napisz, jak to zrobić.

0

Hm... to już mi na javę mało wygląda (to nieszczęsne exe to po co ?). Teraz jest pytanie czy jak uruchamiasz plik exe to uruchamiana jest też jvm? Jeżeli nie to oczywiście jest bardzo nie dobrze. Jeżeli tak to można ją uruchomc z opcją -cp.

0

Exe tworzę z Launch4j. Wydaje mi się, że JVM jest uruchamiane, ponieważ bez JRE exek nie wystartuje. A exe jest po to, że program, do którego w przyszłości chcę wbudować system pluginów pozwala na uruchomienie plików z poziomu Windowsa (na razie tylko na niego robię programy ponieważ nie mam bladego pojęcia o Linuksie, a nie mogę go u siebie zainstalować ze względu na drugiego użytkownika komputera). A Twój pomysł przestał działać już po stworzeniu archiwum JAR, więc nawet, gdymym exe nie tworzył, to trzeba coś innego wymyślić. Najbardziej przydałby mi się kod metody w stylu public Class extractClassFromFile(File f){}

0

Można teoretycznie zrobić w ten sposób, że jak znasz nazwy jarów, klas lub czegokolwiek innego co tam masz to można za pomocą ClassLoader wywołać metodę defineClass( String name, byte[] b, int off, int len )). Jednak nie bawiłem się tym nigdy i nie mam przekonania co do tej metody.

0

Musiałbym znać nazwy wszystkich pluginów. Nie wchodzi w grę.

0

NO to tak dobrze to nie ma :) Niech każdy plugin ładuje się do konkretnego katalogu i poza jarem niech ma swój plik xml z konfiguracją. Pobierasz wszytkie xmle i tyle. Eclipse tak działa

0

Tak może być. Mógłbyś może przesłać mi na maila w ZIPie kod aplikacji głównej oraz folder z jednym pluginem, którego główna klasa wyświetla jakieś okienko? Mój e-mail: [email protected]

1 użytkowników online, w tym zalogowanych: 0, gości: 1