Ja bych rekl, ze prohlizec/jre pouziva nejaky specialni classloader,
ktery tridy kontroluje a registruje jako bezpecne (podepsane).
Pouzitim vlastniho classloaderu to pak nefunguje. Je to jen domnenka -
asi bych zkusil cvicne si vypsat v nejakem testovacim (podepsanem)
appletu, jaky je aktualni classloader a mrkl bych se do zdroju.
Co to nacitani neimplementovat v Jave, ale jinak? Dokazal bych si
predstavit, ze o nacitani by se mohl postarat JavaScript a DHTML.
Paklize ale tam je pozadavek na to, aby program zcasti pracoval (jeste
kdyz neni uplne nacteny), tak to asi JavaScriptem nepujde.
LZ
2008/1/16, Petr Přibyl <[EMAIL PROTECTED]>:
> Ahoj,
>
> řeším problém se zpožděním stažením appletu na webu. Mám aplikaci, která
> je celá zabalená v jaru o velikosti asi 400K, aplikace se spouští jako
> applet ve stránce. Applet je logickou součástí stránky, Java Web Start
> se nehodí. Problém je, že jar je pro řadu uživatelů pořád moc velký a
> zákazníci chtějí progress bar s informací o načítání appletu. Applet je
> Java 5 (6 už umí, co potřebuju, ale jsem vázán verzí 5).
> Program jsem rozdělil na dva jary: malý jar s appletem, který přes
> reflection volá třídy velkého jaru. Pro načtení tříd velkého jaru jsem
> vyplodil ClassLoader, který všechny třídy natáhne do paměti metodou
> getAllClassesFromJarFile. Všechno funguje jak má do okamžiku, kdy
> potřebuju provést nějakou privilegovanou akci. Oba JAR soubory jsou
> podepsané, pokud aplikaci zabalím do jednoho, všechno funguje jak má.
> Něřešil někdo z vás podobný problém?
>
> Příklad:
> malý jar obsahuje samotný applet, který se vykreslí jako tlačítko a při
> stisknutí vyvolá main(String[]) třídy MujAppletClassLoaderTest (uznávám,
> že volání statické metody není košer, ale berte to jako příklad chování
> :o))
>
> public class MujAppletClassLoaderTest {
>
> public static void main(String[] args) {
> String jarUrl =
> "http://localhost/appletExampleTest/appletTests.jar";
>
> URL jar = null;
> try {
> jar = new URL("jar:" + jarUrl + "!/");
> } catch (MalformedURLException mue) {
> System.err.println("Invalid URL: " + jarUrl);
> }
> MujClassLoader mcl = new MujClassLoader(jar);
> HashMap allClasses = mcl.getAllClassesFromJarFile();
> Class prvniClass = (Class)
> allClasses.get("cz.applet.tests.Prvni");
> Object prvniInstance = null;
> try {
> prvniInstance = prvniClass.newInstance();
> } catch (InstantiationException e) {
> e.printStackTrace();
> } catch (IllegalAccessException e) {
> e.printStackTrace();
> } Method zavolejDruhou;
> try {
> zavolejDruhou =
> prvniClass.getMethod("zavolejDruhou", new Class[0]);
> zavolejDruhou.invoke(prvniInstance, new Object[0]);
> } catch (SecurityException e) {
> e.printStackTrace();
> } catch (NoSuchMethodException e) {
> e.printStackTrace();
> } catch (IllegalArgumentException e) {
> e.printStackTrace();
> } catch (IllegalAccessException e) {
> e.printStackTrace();
> } catch (InvocationTargetException e) {
> e.printStackTrace();
> }
> }
> }
>
> Třída nejprve vytvoří instanci MujClassLoaderu a načte všechny třídy z
> velkéko jaru. Potom před reflection volá instance tříd.
> Velký jar v příkladě obsahuje pouze třídy Prvni a Druha.
>
> package cz.applet.tests;
>
> public class Prvni {
> private String jmenoTridy = this.getClass().getName();
> public Prvni() {
> System.out.println("Byla vytvorena instance tridy " + jmenoTridy);
> }
> public void zavolejDruhou() {
> Druha d = new Druha();
> d.vypisUserHome();
> }
> }
>
>
> package cz.applet.tests;
>
> public class Druha extends Prvni {
> public void vypisUserHome() {
> System.out.println("vypisUserHome " +
> System.getProperty("user.home"));
> }
> }
>
> Problém je ve výrazu System.getProperty("user.home"); - program vyhodí
> SecurityException. Pokud je všechno v jenom Jar souboru nebo místo
> výrazu dáme neprivilegovaný příkaz, všechno je OK.
>
> Můžete mě prosím někdo nakopnout správným směrem?
>
> Dík
>
> Petr Přibyl
>
>
>
>
--
Lukas Zapletal
http://lukas.zapletalovi.com