2012-01-15 10 views
6

C: Scala - Dinamik sınıf yükleme - A sınıfı sınıfına döküm edilemez Dersim <code>A</code> içeren basit kavanoz dosyası var

public class A {} 

Sonra zamanında yükleyecek:

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

O tamam, sınıf A yükleyebilir. Bu komut Tamam da:

clazz.newInstance 

Ama A için döküm zaman:

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

bana yardım eder misiniz:

clazz.newInstance.asInstanceOf[A] 

bu hata var?

+1

AsInstanceOf [A] kullanan kodla ne yapmaya çalışıyorsunuz? –

cevap

5

Kodunuz, clazz nesnesini aldığınız yerden ayrı bir bağlam olan clazz.newInstance.asInstanceOf [A] öğesini çağırdığınız bir classLoader bağlamında "A" olduğunu gösterir. Sorun, iki farklı classLoader bağlamında "A" sınıfının iki farklı örneğinizin olmasıdır. "A" sınıfının bir sürümünden oluşturulan bir nesne, farklı bir sınıfYükleyici bağlamındaki diğer sürümün bir örneğine yayınlanamaz.

+0

Teşekkür ederim. Ama eğer bunu Java’da yaparsam, sorun değil. Kodumu düzeltebilir misiniz, böylece bir ders yükleyebilir ve kullanabilir miyim? –

+0

Üzgünüm. Aslında Java'da 'I' arayüzüne sahibim. '' '' '' Dan uygulanır. “A” yi kavanozdan yüklediğimde, bunun “ben” örneğinin olup olmadığını kontrol edip, “ben” ve kullanıyorum. Tamamdır. –

+0

@HiBlack - Scala'da, hiçbir yöntem uygulaması olmayan özellik veya vals/vars, doğrudan java arabirimine derler. Belki de "A" kelimesinin bir tür "Ben" i genişletebilir ve kadronuzu yapabilirsin? – Rogach

4

Çok benzer bir sorunla karşılaştım, dinamik olarak yüklenmiş bir nesneyi uyguladığı bir arabirime dönüştürdüğümde ClassCastException'u gözlemledim.
Neil'in cevabı sayesinde, ClassCastException'un farklı sınıf yükleyici bağlamlarına sahip olmasından kaynaklandığını tespit edebildim.

Bunu düzeltmek için URLClassLoader(URL[] urls) yapıcısı yerine URLClassLoader(URL[] urls, ClassLoader parent) yapıcısını kullandım.

+0

10 Thx, bu gerçekten sorunumu çözüyor. –

İlgili konular