【问题标题】:Scala v 2.10: How to get a new instance of a class (object) starting from the class nameScala v 2.10:如何从类名开始获取类(对象)的新实例
【发布时间】:2013-08-18 10:20:48
【问题描述】:

我有数十个 JSON 片段要解析,并且我需要为每个片段获取正确解析器的实例。我的想法是创建一个配置文件,在其中写入要为每个解析器实例化的类的名称(一种映射 url -> 解析器)。回到您的解决方案,如果我有一个指向 Any 的指针,我将无法调用我在每个解析器中实现的方法。我想这是一个非常常见的问题,使用完善的解决方案,但我不知道最佳实践是什么。

我真的没有使用 Java、反射、类加载和所有这些东西的经验。所以, 任何人都可以为我写下面方法的主体吗?我需要获取一个作为 String 传递的类的实例(构造函数不需要参数,至少到目前为止......)

def createInstance(clazzName: String) = {
  // get the Class for the given clazzName, e.g. "net.my.BeautifulClazz"

  // instantiate an object and return it
}

谢谢,像往常一样......

【问题讨论】:

    标签: scala classloader scala-2.10


    【解决方案1】:

    有一个很简单的答案:

    scala> def createInstance(clazzName: String) = Class.forName(clazzName).newInstance
    createInstance: (clazzName: String)Any
    
    scala> createInstance("java.lang.String")
    res0: Any = ""
    

    如果它适合你,一切都很好。如果没有,我们必须查看您的类加载器。这通常是事情变脏的时候。

    根据你想做什么,看看:

    1. cake pattern,如果您想在编译期间合并您的类
    2. 当您想要构建插件基础架构时使用 OSGi(查看 here 以获得非常简单的示例)
    3. Google guice,如果你真的需要依赖注入(例如在混合 Scala 和 Java 代码时)并且蛋糕模式不适合你

    【讨论】:

    • 感谢您的回答。好吧,关于你的提议,我有一些话要说。我找到了您发布的解决方案,关键是我需要从 Any 转换为我设计的特定对象。我刚刚在我的原始帖子中添加了一个关于我正在尝试做的事情的简要说明。再次感谢您问我。
    • 好的,我刚刚意识到我可以使用简单的工厂模式来实现我的目标:不需要类加载等。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2020-06-28
    • 1970-01-01
    • 1970-01-01
    • 2016-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多