2012-01-15 12 views
6

Tengo un archivo JAR simple que contiene la clase A:Scala - carga dinámica de clases - la clase A no se puede convertir a la clase A

public class A {} 

Entonces cargarlo en tiempo de ejecución:

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

Se está bien, puede cargar la clase A. Esta orden es también aceptable:

clazz.newInstance 

Pero cuando lo eché a A:

clazz.newInstance.asInstanceOf[A] 

me dio este error:

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

¿Me podría ayudar?

+1

¿Qué intentas lograr con el código que usa asInstanceOf [A]? –

Respuesta

5

Su código implica que tiene "A" disponible en un contexto de classLoader en el que llama a clazz.newInstance.asInstanceOf [A], que es un contexto separado del que está recibiendo el objeto clazz. El problema es que tiene dos instancias diferentes de la clase "A" en dos contextos diferentes de ClassLoader. Un objeto que se crea a partir de una versión de la clase "A" no se puede convertir a una instancia de la otra versión en un contexto diferente de classLoader.

+0

Gracias. Pero si hago eso en Java, está bien. ¿Podrían arreglar mi código para poder cargar una clase y usarla? –

+0

Lo siento. De hecho, en Java tengo una interfaz 'I'. 'A' se implementa desde' I'. Cuando cargo 'A' desde jar, compruebo si es una instancia de' I', luego lo lanzo a 'I' y lo uso. Está bien. –

+0

@HiBlack - en Scala, rasgo sin implementaciones de métodos o compilaciones vals/vars directamente a la interfaz java. ¿Tal vez puedas hacer que tu "A" extienda algún rasgo "I" y luego hacer tu reparto? – Rogach

4

Experimenté un problema muy similar, ya que observé un ClassCastException cuando lanzo un objeto cargado dinámicamente a una interfaz implementada por él.
Gracias a la respuesta de Neil, pude determinar que el ClassCastException fue causado por tener diferentes contextos de cargador de clases.

Para solucionar esto utilicé el constructor URLClassLoader(URL[] urls, ClassLoader parent) en lugar del URLClassLoader(URL[] urls) constructor.

+0

Thx, esto realmente resolver mi problema. –

Cuestiones relacionadas