Refleksja w Javie - uruchamianie zewnętrznego .JAR

0

Potrzebuję odpalić zewnętrzny plik .JAR wraz z podanymi argumentami. Rzadko bawię się refleksją, więc poszukałem w internecie paru gotowców i skleiłem z nich to:

protected void runApplication(File file, String[] args) {
    try {
        JarFile jarFile = new JarFile(file);
        Manifest manifest = jarFile.getManifest();
        String mainClass = manifest.getMainAttributes().getValue("Main-Class");
        jarFile.close();
        URL[] url = new URL[] { file.toURI().toURL() };
        URLClassLoader child = new URLClassLoader(url, this.getClass().getClassLoader());
        Class classToLoad = Class.forName(mainClass, true, child);
        Method method = classToLoad.getDeclaredMethod("main", String[].class);
        method.invoke(null, args);
    }
	//obsługa wyjątków
}

Zwraca mi to java.lang.IllegalArgumentException: argument type mismatch, mimo, że obydwie linijki poniżej wyświetlają [Ljava.lang.String;, a więc tablicę Stringów:

System.out.println(args.getClass().getName());
for (Class c : method.getParameterTypes()) {
    System.out.println(c.getName());
}

Czy mógłby mi ktoś podpowiedzieć, co robię źle?

0

Znalazłem rozwiązanie, zostawiam je tu dla potomnych:

Drugi argument do Method.invoke to tablica Object, a funkcja main przyjmuje jako argument tablicę String. Nie mogę jednak dać tablicy String jako parametru Method.invoke, bo wtedy uruchamiana funkcja main uzna ją nie za jedną zmienną - tablicę, tylko za kilka zmiennych typu String.

//w argumencie funkcji runApplication jest tablica String[] args
Object[] methodArguments = new Object[] { args };
method.invoke(null, methodArguments);

Teraz tablica String[] jest zapisywana jako jeden element tablicy Object[] i dopiero ta tablica jest przekazywana metodzie main. Teraz ładnie działa.

Jednak było łatwe do rozwiązania :3

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