如何根据用户输入创建一个scala类?

时间:2013-12-13 16:36:29

标签: scala

我有一个用例,我需要根据用户输入创建一个类。

例如,用户输入可以是:“(Int,fieldname1):( String,fieldname2):.. etc” 然后必须在运行时如下创建一个类

Class Some
{
   Int fieldname1
   String fieldname2
   ..so..on..
}

这是Scala支持的东西吗?任何帮助都非常感谢。

3 个答案:

答案 0 :(得分:4)

您的方案似乎没有意义。这不是运行时实例化的问题(JVM当然可以通过反射来实现)。真的,你要问的是动态生成一个类,这只有在你的代码稍后使用它时才有用。但是,如果您不知道它的外观,您的代码如何在以后使用它?例如,您的后期代码将如何知道它可以引用哪些字段?

答案 1 :(得分:0)

不,不是真的。

类的想法是定义一个可以在编译时检查的类型。你看,在运行时创建它会有点矛盾。

您可能希望以不同的方式存储用户输入,例如一张地图。

你想通过在运行时创建一个类来实现什么?

答案 2 :(得分:0)

我认为这是有道理的,只要您以通用方式使用“数据模型”。

这种方法在这里有效吗?要看。

如果您的数据来自文件,在运行时读取但可用在编译时,那么您很幸运类型 - 将保持安全。事实上,您将有两种选择。

  1. 将您的项目拆分为两个:

    • 在第一次运行中,读取文件并编写新源 以编程方式(作为字符串,或更好,与Treehugger)。

    • 在第二次运行中,使用项目的其余部分编译生成的类并正常使用它。

  2. 如果#1过于“手动”,请使用Macro Annotations。这里的想法是主子项目的编译时间遵循宏子项目的运行时。因此,如果我们为主子项目提供“空”类,则可以使用宏在运行时看到的数据在编译时动态添加成员。 - 要开始使用,请修改宏以从this example

  3. 中的文件中读取

    否则,如果您的数据真正只能在运行时知道,那么@Rob Starling的建议可能会对您有所帮助。如果你想成为一只豚鼠,我会分享my attempt。对于调试,我在那里有一个App.scala,它显示了如何将字符串传递给运行时类生成器并在运行时使用Java反射访问它,甚至用它定义一个Scala类型别名。所以问题是,你的新动态类是否会在Slick中作为类型参数,或者在其他库中有时会失败?