2012-01-15 8 views
6

Ho un semplice file barattolo contenente classe A:Scala - Dynamic class carico - classe A non può essere lanciato alla classe A

public class A {} 

Poi lo carico in fase di esecuzione:

var classLoader = new URLClassLoader(Array(my_jar_file.toURI.toURL)) 
var clazz = classLoader.loadClass("A") 

E ' è ok, può caricare la classe A. Questo comando è anche ok:

clazz.newInstance 

Ma quando ho gettato a A:

clazz.newInstance.asInstanceOf[A] 

ho ottenuto questo errore:

java.lang.ClassCastException: A cannot be cast to A 

per favore potete aiutarmi?

+1

Cosa stai cercando di ottenere con il codice che utilizza asInstanceOf [A]. –

risposta

5

Il codice implica che è disponibile "A" in un contesto classLoader in cui si chiama clazz.newInstance.asInstanceOf [A], che è un contesto separato da cui si ottiene l'oggetto clazz. Il problema è che ci sono due diverse istanze della classe "A" in due diversi contesti classLoader. Non è possibile eseguire il cast di un oggetto creato da una versione della classe "A" su un'istanza dell'altra versione in un diverso contesto classLoader.

+0

Grazie. Ma se lo faccio in Java, va bene. Potresti correggere il mio codice, quindi posso caricare un corso e usarlo? –

+0

Mi dispiace. In realtà in Java ho un'interfaccia 'I'. 'A' è implementato da' I'. Quando carico 'A' dal barattolo, controllo se è un'istanza di' I', quindi lancio su 'I' e uso. Va bene. –

+0

@HiBlack - in Scala, tratto senza implementazioni del metodo o vals/vars viene compilato direttamente nell'interfaccia java. Forse puoi far sì che la tua "A" estenda un tratto di "I", e poi crea il tuo cast? – Rogach

4

Ho riscontrato un problema molto simile, in quanto ho osservato uno ClassCastException durante il casting di un oggetto caricato in modo dinamico su un'interfaccia implementata da esso.
Grazie alla risposta di Neil, sono stato in grado di determinare che lo ClassCastException era causato dall'avere contesti di caricamento classi diversi.

Per risolvere questo problema ho utilizzato il costruttore URLClassLoader(URL[] urls, ClassLoader parent) anziché il costruttore URLClassLoader(URL[] urls).

+0

Thx, questo risolve davvero il mio problema. –

Problemi correlati