相关疑难解决方法(0)

如何使用反射调用Scala Object方法?

说,我有以下几点:

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)

或类似的东西.

谢谢

reflection scala object

33
推荐指数
3
解决办法
2万
查看次数

Scala - 动态类加载 - 类A不能转换为A类

我有一个包含类的简单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)

请你帮助我好吗?

scala class loading dynamic classloader

6
推荐指数
1
解决办法
6482
查看次数

如果我知道对象的类名,如何获取它并调用其方法?

我有一个特点,命名为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$ …

scala object

1
推荐指数
1
解决办法
407
查看次数

标签 统计

scala ×3

object ×2

class ×1

classloader ×1

dynamic ×1

loading ×1

reflection ×1