PDA

View Full Version : [JAVA] Classloader modificato


morskott
11-02-2008, 20:39
Salve, avrei bisogno di modificare il comportamento standard di java per instanziare classi, il problema è che la macchina dove va ad eseguirsi il server puù non avere disponibile in locale la classe che voglio fargli eseguire ma sa l'indirizzo della macchina remota che ha il .class (la computazione la deve fare la macchina server, quindi niente RMI o cose del genere), la mia idea è quella di ridefinire un nuovo ClassLoader che in caso non trovi la risorsa in locale la vada a scaricare dalla macchina remota, qualcosa del tipopublic class MioClassLoader extends ClassLoader{
private InetAddress indirizzoClient;
provate ClassLoader parent;

public MioClassLoader(ClassLoader parent,InetAddress address){
this.parent=parent;
this.indirizzoClient=address;}

public Class findClass(String name){
if (notLocale(name) recuperaClassDaClient(this.indirizzoClient) //Se il .class non è in locale lo trasferisco dal client
return this.parent.findClass(name);
}
}, a questo punto dovrei sostituire il classloader di default con la mia implementazione, ma non riesco a trovare nessun metodo che mi consenta di farlo (ho spulciato sia la documentazione della classe System che quella del ClassLoader e per finire quella del SecurityManager), come posso fa?

^TiGeRShArK^
11-02-2008, 21:04
Salve, avrei bisogno di modificare il comportamento standard di java per instanziare classi, il problema è che la macchina dove va ad eseguirsi il server puù non avere disponibile in locale la classe che voglio fargli eseguire ma sa l'indirizzo della macchina remota che ha il .class (la computazione la deve fare la macchina server, quindi niente RMI o cose del genere), la mia idea è quella di ridefinire un nuovo ClassLoader che in caso non trovi la risorsa in locale la vada a scaricare dalla macchina remota, qualcosa del tipopublic class MioClassLoader extends ClassLoader{
private InetAddress indirizzoClient;
provate ClassLoader parent;

public MioClassLoader(ClassLoader parent,InetAddress address){
this.parent=parent;
this.indirizzoClient=address;}

public Class findClass(String name){
if (notLocale(name) recuperaClassDaClient(this.indirizzoClient) //Se il .class non è in locale lo trasferisco dal client
return this.parent.findClass(name);
}
}, a questo punto dovrei sostituire il classloader di default con la mia implementazione, ma non riesco a trovare nessun metodo che mi consenta di farlo (ho spulciato sia la documentazione della classe System che quella del ClassLoader e per finire quella del SecurityManager), come posso fa?
se non ricordo male non puoi sostituire il classloader di default, ma puoi aggiungerne altri che vengono utilizzati seguendo un certo ordine...
Intanto ho trovato quest'articolo che dovrebbe spiegare un pò meglio il concetto :p
http://www-128.ibm.com/developerworks/java/library/j-dclp1/

lovaz
12-02-2008, 11:22
http://java.sun.com/javase/6/docs/api/java/lang/Thread.html#setContextClassLoader(java.lang.ClassLoader)

con questo dovresti settare il cl per il thread corrente e i suoi figli