Opakované načtení souboru .class – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Opakované načtení souboru .class – Java – Fórum – Programujte.comOpakované načtení souboru .class – Java – Fórum – Programujte.com

 

Majk
~ Anonymní uživatel
5 příspěvků
26. 12. 2016   #1
-
0
-

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í.

Nahlásit jako SPAM
IP: 188.75.176.–
ondrej39+1
Věrný člen
27. 12. 2016   #2
-
0
-

#1 Majk

Spíš než řešit tvůj, podle mě, absolutně nesmyslný problém napiš, na co konkrétně tuto věc potřebuješ. Třeba to půjde udělat nějak jinak, bez hacků.

Nahlásit jako SPAM
IP: 46.39.172.–
Inject all the dependencies!
Majk
~ Anonymní uživatel
5 příspěvků
27. 12. 2016   #3
-
0
-

#2 ondrej39
Píšu aplikaci, kde se graficky znázorňují vytvořené - naplněné vztahy mezi instancemi, vztahy, jako jsou například asociace, agregace, apod.

Tj. že se třeba pomocí setrů nastaví nějaká proměnná v instanci třídy, tak se mezi příslušnými instancemi vytvoří nějaká vazba - hrana v grafu, která to znázorňuje a zdrojový kód těchto tříd lze dále upravovat, po té je třeba tyto třídy znovu zkompilovat a načíst.

Alespoň takový je princip aplikace, nebo mám nějaké postupy rozebrat?

Nahlásit jako SPAM
IP: 188.75.176.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 9 hostů

Podobná vlákna

C++ načtení ze souboru — založil james2000

Nacteni ze souboru — založil sedma

Načtení souboru? — založil DjHard

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý