说,我有以下几点:
trait SomeTrait {
def someMethod: String;
}
object SomeObject extends SomeTrait {
def someMethod = "something";
}
Run Code Online (Sandbox Code Playgroud)
我想使用反射调用"someMethod",因为我将对象名称作为String.就像是:
val objectName = "SomeObject"
val someTrait:SomeTrait = ???.asInstanceOf[SomeTrait]
someTrait.someMethod
Run Code Online (Sandbox Code Playgroud)
或类似的东西.
谢谢
我有一个包含类的简单jar文件A:
public class A {}
Run Code Online (Sandbox Code Playgroud)
然后我在运行时加载它:
var classLoader = new URLClassLoader(Array(my_jar_file.toURI.toURL))
var clazz = classLoader.loadClass("A")
Run Code Online (Sandbox Code Playgroud)
没关系,它可以加载课程A.这个命令也可以:
clazz.newInstance
Run Code Online (Sandbox Code Playgroud)
但当我把它投射到A:
clazz.newInstance.asInstanceOf[A]
Run Code Online (Sandbox Code Playgroud)
我收到了这个错误:
java.lang.ClassCastException: A cannot be cast to A
Run Code Online (Sandbox Code Playgroud)
请你帮助我好吗?
我有一个特点,命名为Init:
package test
trait Init {
def init(): Any
}
Run Code Online (Sandbox Code Playgroud)
有一些类和一个对象,扩展了这个特性:
package test
object Config extends Init {
def init() = { loadFromFile(...) }
}
class InitDb extends Init {
def init() = { initdb() }
}
Run Code Online (Sandbox Code Playgroud)
当应用程序启动时,我将找到所有扩展的类和对象Init,并调用它们的init方法.
package test
object App {
def main(args: Array[String]) {
val classNames: List[String] = findAllNamesOfSubclassOf[Init]
println(classNames) // -> List(test.Config$, test.InitDb)
classNames foreach { name =>
Class.forName(name).newInstance().asInstanceOf[Init].init() // ***
}
}
}
Run Code Online (Sandbox Code Playgroud)
请注意" * "行.因为test.InitDb,没关系.但是,对于test.Config$ …