, bu arada (.jar dosyası) dış sınıfını yükleyin.Scala Dinamik nesne/sınıf yükleme Java'da
====================
Şimdi Scala aynı şeyi yapmak istiyorum.
trait Module {
def name: String
}
object Module {
lazy val ModuleClassName = "my.module.ExModule"
}
Ben
Module
uzanan bir modül yazmak, sonra
module.jar
bunu derlemek: Bir
trait
adında
Module
(
Module.scala
) sahip
var classLoader = new URLClassLoader(Array[URL](
new File("module.jar").toURI.toURL))
var clazz = classLoader.loadClass(Module.ModuleClassName)
:
package my.module
import Module
object ExModule extends Module {}
Sonra bu kodla yüklemek
İyi çalışıyor. Bunu test ederseniz
java.lang.InstantiationException: my.module.ExModule
: Ben yeni bir örneğini oluşturmak Ama eğer, bu durum alıyorum
-> hep false
dönün.
Bu konuda bana yardımcı olabilir misiniz?
Düzenlendi
Ben ExModule
bir object
(değil class
) olduğu için sanırım. Ancak, class
olarak değiştirdiğimde ve classLoader.loadClass(...)
, java.lang.NoClassDefFoundError
yükseltir. Sanırım, ExModule
, trait
'dan uzatıldı.
Kafam karıştı. Lütfen biri bana yardım edebilir mi?
Düzenlenen
clazz.isInstanceOf[Class[Module]]//or Class[Byte], or Class[_]...
döner true
.
Sanırım bir sınıf yapmakla daha yakın olursunuz (ClassNotFoundException'ı aldığınızda). Module.jar 'a başvuruda bulunduğunuzda yolun doğru olduğundan emin misiniz? Bir özellikten uzatılmasının bir fark yaratmaması gerekir - ExModule bir sınıftır (bu durumda). –
Evet 'module.jar' yolunun doğru olduğundan eminim. "ClassLoader.loadClass (...)" yöntemi iyi çalışıyor (ExModule '' object' ise). –
Derlenmiş bayt koduyla (javap veya benzeri) bakabilir misiniz? Scalac, her yerde $ s ve diğer garip isimleri eklemenin eğlenceli bir alışkanlığı var ve belki de ExModule'ınızın derlenmiş versiyonda başka bir ismi var. Ayrıca, scalac’ın java kodunu scala’nızda yazdırabilmesini isteyebilirsiniz (şimdi sadece seçeneği hatırlamıyorum). – Rogach