Scala中带有参数的动态实例化对象-asInstanceOf不接受参数

时间:2018-11-08 14:51:57

标签: scala class reflection

我需要在Scala中动态实例化一个对象。 类名作为参数传递给main方法。 具有所有方法的实际类是从另一个包中导入的

我在以下链接中提到了解决方案

instantiate object with reflection using constructor arguments Scala: How do I dynamically instantiate an object and invoke a method using reflection?

我的问题是我无法将类名参数传递给asInstanceOf。下面是代码。

import com.xxx.xxx.warehouse.sbi
val classParam = "sbi" //to make it easy, i hardcoded the value.
val constructor = Class.forName(classParam).getConstructors()(0)
val args = Array[AnyRef](String,String)
val instance1 
=constructor.newInstance(args:_*).asInstanceOf[classParam]

以上代码的最后一行抛出错误classParam,无法解决。 asInstanceOf将需要类型T的参数。我的类“ sbi”具有许多方法。但是在这种情况下,我该如何解决。有 类似于“ sbi”的多个类

我要解决的问题:

我有500个案例类要从com.xxx.xxx.warehouse包中导入。让我们将它们命名为sbi1,sbi2,sbi3 ... sbi500。所有这些类都扩展了另一个具有多个方法的类。有一个方法“ getLatestVesrion”,它根据类名查找S3文件的最新版本。每个案例类都将一个S3文件作为输入

我需要使用上述类为S3中的所有500个数据集获取每个S3文件的最新版本。我不想显式地调用每个类,而是根据需要动态地调用这些类。如果我显式调用它们,则需要为每个类编写两行代码。因此,我将在运行时传递类名sbi1,sbi2,sbi3 ..sbi500。根据类名,需要获取最新版本。

从技术上讲,给定类名称的字符串,如何访问该类名称中的方法?

1 个答案:

答案 0 :(得分:0)

我想我不明白您要在这里实现什么!

让我们回顾一下:

  • 仅在运行时知道实际的类类型

  • 您正在尝试在代码中强制转换instance1,这将在编译时强制其类型

  • 但是,如果您知道在编译时如何强制转换instance1,则不需要运行时参数以!!

  • 开头。

我怀疑您将无法以任何方式强制转换instance1,因为在编译时没有已知类型可将其强制转换为^^

如果所有类都有一个通用接口,则可以将其插入其中,这应该没问题。

编辑:我认为您毕竟是在进行“经典”反射调用,请看这里:https://stackoverflow.com/a/39135220/2404988:-)