【问题标题】:scala create dynamic factory based on trait inheritancescala创建基于特征继承的动态工厂
【发布时间】:2016-08-31 23:07:42
【问题描述】:

我有几个类扩展了一个特征。 我创建了一个使用模式匹配来实例化相关类的工厂方法。

问题在于,每当我创建一个扩展此特征的新类时,我都需要手动将其添加到工厂方法中。 是否有一个选项可以从所有可用的类中动态创建类列表?

谢谢

一些代码示例:

当前实现:

object Test {
  trait Parent
  object Parent{
    def apply(classType:String): Parent = classType match {
      case "A" => new A
      case "B" => new B
      case "C" => new C

    }
  }
  class A extends Parent
  class B extends Parent
  class C extends Parent
}

想要的行为:

object Test {
  trait Parent
  object Parent{
    def apply(classType:String): Parent = SomeFunction(ClassType)

    }
  }
  class A extends Parent
  class B extends Parent
  class C extends Parent
}

【问题讨论】:

  • 给我一些代码:)

标签: scala reflection factory


【解决方案1】:

使用反射得到所有扩展这个trait的类

获取相关类并将它们添加到列表中。

或者,您可以创建一个Map,它可以帮助通过一些key定位类

代码

package demo


trait Animal {

}

class Dog extends Animal

class Cat extends Animal

使用的库org.clapper" %% "classutil" % "1.0.11"

import org.clapper.classutil.{ClassFinder, ClassInfo}

object Main {
  def main(args: Array[String]): Unit = {
    val finder  = ClassFinder()
    val classes = ClassFinder.classInfoMap(finder.getClasses().iterator)
    val impl    = find("demo.Animal", classes)
    impl.foreach(println)
  }
  def find(ancestor: String, classes: Map[String, ClassInfo]): List[ClassInfo] =
    classes.get(ancestor).fold(List.empty[ClassInfo]) { ancestorInfo =>
      val ancestorName = ancestorInfo.name

      def compare(info: ClassInfo): Boolean =
        info.name == ancestorName ||
          (info.superClassName :: info.interfaces).exists {
            n => classes.get(n).exists(compare)
          }

      val it = classes.valuesIterator
      it.filter { info => info.isConcrete && compare(info) } .toList
    }
}

输出

demo.Dog
demo.Cat

请注意,大部分代码取自这篇文章并更改为套件当前用途Get all the classes that implments a trait in Scala using reflection

【讨论】:

  • 它因以下异常而失败:class org.clapper.classutil.asm.ASMEmptyVisitor has interface org.objectweb.asm.ClassVisitor as super class
猜你喜欢
  • 2020-11-11
  • 2019-04-19
  • 1970-01-01
  • 2018-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-05
  • 1970-01-01
相关资源
最近更新 更多