Ahoj všichni, řeším nemalý problém, už delší dobu se snažím přijít na to, jak by šla pomocí reflexe, neboli za běhu aplikace (napsané v Javě) načíst jedna zkompilovaná třída vícekrát, a nemohu na to přijít, je tu někdo kdo by si s tím věděl rady?
Konkrétní příklad:
Vytvořím a libovolně v aplikaci zedituji třídu, zkompiluji jí a načtu pomocí ClassLoaderu, dosud vše OK, ale když tuto třídu opět jakkoli zedituji, znovu zkompiluji a opět načtu pomocí ClassLoaderu, tak se mi načte ta původní třída, resp. soubor .class, což je ale špatně, potřebuji načíst tu aktuální.
Vím, že bych měl pokaždé vytvořit novou instanci ClassLoaderu s konkrétní URL, protože si JVM drží "takto načtená data", jenže když to udělám, pak když chci zavolat metodu v jedné třídě, jejímž parametrem je instance druhé třídy, tak mi to pokaždé vyhodí vyjímku: java.lang.IllegalArgumentException: argument type mismatch a nevím proč.
Například:
třída X má metodu jejímž parametrem je instance třídy Y:
public class X {
public void someName(Y y) {...}
}
public class Y {...}
Jak jsem již zmínil výše, pomocí jednoho ClassLoaderu si načtu obě zkompilované třídy X a Y vytvořím instance obou tříd a zavolám metodu someName nad instancí X jejímž parametrem je instance vytvořená instance třídy Y, to funguje v pořádku, ale když nyní provedu nějaké úpravy třeba ve třídě Y a znovu ji zkompiluji, načtu pomocí stejného ClassLoaderu, tak se mi načte pořád ta původní třída, resp. soubor .class zkompilované třídy Y, což nechci, potřebuji tu aktuální a nevím jak na to?
Dále pokud použiji pro výše zmíněné načítání souborů .class odlišné ClassLoadery, resp. jeden ClassLoader pro jedno načtení třídy, tak mi při stejném postupu vytvoření instancí a zavolání metody vyskočí zmíněná vyjímka: IllegalArgumentException a opět nevím proč tomu tak je, případně jak to vyřešit?
tak vyjímka vyskočí na řádku s kódem:
method_someName.invoke(instanceX, instanceY);
- ani metoda, ani jeden z parametrů neni null, a vše je správného typu včetně instancí, jedna je: X@xxx a druhá Y@xxxx, apod. tak nevím co s tím dál?
Pro načítání zkompilované - přeložené třídy používám následující kód:
ClassLoader cl = new UrlClassLoader(new URL[]{pathToClassAsUrl});
Class<?> compiledClass = cl.loadClass(className);
Potřebuji tedy přijít na to, jak využít jeden classLoader, případně něco, jak bych mohl pokaždé načíst ! Aktuální ! soubor - přeloženou třídu typu .class do proměnné typu java.lang.Class pro další manipulaci a aby takto načtené třídy neměly po vytvoření jejich instanci a zavolání metod mezi sebou zmíněné problémy u předávání referencí v metodách, apod.
Předem díky za rady a ochotu s pomocí.