如何从类名获取伴侣对象?

时间:2020-06-23 02:46:12

标签: scala

我有一些Spark模型文件,我想加载它们。一种方法是编写以下代码。

LogisticRegressionModel.load(path)

但是,我需要有一个模型对象,以便调用LogisticRegressionModel.load。我只得到像org.apache.spark.ml.classification.LogisticRegressionModel这样的类名,所以我需要从类名反映同伴对象,但是我该怎么做呢?

From this post,我发现这可能是一个坏方法。但是当我尝试时,在companion中没有找到classMirror字段。

1 个答案:

答案 0 :(得分:3)

如果您知道编译时的类型,则可以尝试使用在2020年可用的稍新的API:

import scala.reflect.runtime.universe._

def findCompanionOf[T: TypeTag] =
  runtimeMirror(getClass.getClassLoader)
    .reflectModule(typeOf[T].typeSymbol.companionSymbol.asModule)
    .instance
@ findCompanionOf[Long]
res15: Any = object scala.Long

如果您仅知道名称为StringClass[_] ...,则如果存在同伴,则为.class名称+ $,而实例应位于静态字段MODULE$

def findCompanionOf(clazz: Class[_]) =
  clazz.getClassLoader
    .loadClass(classOf[List[_]].getName + "$")
    .getField("MODULE$")
    .get(null) // obtaining static field = obtaining value for null instance
@ findCompanionOf(classOf[List[_]])
res25: Class[?0] = class scala.collection.immutable.List$

在两种情况下,如果类/类型都没有同伴,则使用throw进行编码,尽管第二种版本也无法使用LongInt等原语。

在您的情况下,类似:

findCompanionOf(
  getClass.getClassLoader.loadClass("org.apache.spark.ml.classification.LogisticRegressionModel")
)

可能会工作。

相关问题