我有一个用例,我需要根据用户输入创建一个类。
例如,用户输入可以是:“(Int,fieldname1):( String,fieldname2):.. etc” 然后必须在运行时如下创建一个类
Class Some
{
Int fieldname1
String fieldname2
..so..on..
}
这是Scala支持的东西吗?任何帮助都非常感谢。
答案 0 :(得分:4)
您的方案似乎没有意义。这不是运行时实例化的问题(JVM当然可以通过反射来实现)。真的,你要问的是动态生成一个类,这只有在你的代码稍后使用它时才有用。但是,如果您不知道它的外观,您的代码如何在以后使用它?例如,您的后期代码将如何知道它可以引用哪些字段?
答案 1 :(得分:0)
不,不是真的。
类的想法是定义一个可以在编译时检查的类型。你看,在运行时创建它会有点矛盾。
您可能希望以不同的方式存储用户输入,例如一张地图。
你想通过在运行时创建一个类来实现什么?
答案 2 :(得分:0)
我认为这是有道理的,只要您以通用方式使用“数据模型”。
这种方法在这里有效吗?要看。
如果您的数据来自文件,在运行时读取但可用在编译时,那么您很幸运和类型 - 将保持安全。事实上,您将有两种选择。
将您的项目拆分为两个:
在第一次运行中,读取文件并编写新源 以编程方式(作为字符串,或更好,与Treehugger)。
在第二次运行中,使用项目的其余部分编译生成的类并正常使用它。
如果#1过于“手动”,请使用Macro Annotations。这里的想法是主子项目的编译时间遵循宏子项目的运行时。因此,如果我们为主子项目提供“空”类,则可以使用宏在运行时看到的数据在编译时动态添加成员。 - 要开始使用,请修改宏以从this example
否则,如果您的数据真正只能在运行时知道,那么@Rob Starling的建议可能会对您有所帮助。如果你想成为一只豚鼠,我会分享my attempt。对于调试,我在那里有一个App.scala,它显示了如何将字符串传递给运行时类生成器并在运行时使用Java反射访问它,甚至用它定义一个Scala类型别名。所以问题是,你的新动态类是否会在Slick中作为类型参数,或者在其他库中有时会失败?