Domanda

Sto usando Rhino tramite il bean scripting framework per creare e configurare oggetti nel mio processo Java. Alcune delle classi utilizzate negli script devono essere caricate in modo dinamico poiché non saranno sempre sul percorso di classe standard.

Per caricare queste classi ho inizializzato la factory di contesto del framework di scripting con un caricatore di classi personalizzato che carica queste classi da una directory ausiliaria. Funziona bene.

Il problema è che alcune di queste classi, nei loro costruttori, usano altre classi che devono anche essere caricate da questa directory ausiliaria. Guardando la fonte vedo che il motore javascript sta semplicemente chiamando Constructor.newInstance.

Come faccio a sapere quale classloader utilizza la chiamata newInstance e posso inserire il mio in modo da poter caricare manualmente le classi che il caricatore di classi standard non sa come caricare.

È stato utile?

Soluzione

Prova a impostare il programma di caricamento classi principale del programma di caricamento classe sul programma di caricamento classe dell'applicazione.

ClassLoader myLoader = new ClassLoader(getClass().getClassLoader()) { 
... your code loading from custom directory ...
}

Le classi caricate dal tuo caricatore utilizzeranno il tuo caricatore per cercare altre classi, quindi il tuo caricatore deve fornirle (delegando al genitore)

Altri suggerimenti

Constructor.newInstance opera su un'istanza Costruttore , che appartiene a una particolare istanza Class che è stata caricata da un particolare ClassLoader . Le classi si collegano tramite il proprio caricatore di classi.

Single-arg Class.forName utilizza il caricatore di classi del chiamante immediato (è un'API molto cattiva).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top